def dbfunc(records):
db = pymysql.connect("localhost","root","root","spark")
cursor = db.cursor()
def doinsert(p):
sql = "insert into wordcount(word,count) values ('%s', '%s')" % (str(p[0]), str(p[1]))
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
for item in records:
doinsert(item)
def func(rdd):
repartitionedRDD = rdd.repartition(3)
repartitionedRDD.foreachPartition(dbfunc)
running_counts.foreachRDD(func)
running_counts :看作日志文件
函数之间的依次调用: 对每一个元素,用func 进行处理,func处理过程中,对每一个RDD再调用dbfunc进行处理,将其保存到mysql数据库
也就是说,这里定义了一个内部函数dbfunc,它的功能是,接收records,然后把records保存到MySQL中。到这里,你可能会有疑问?为什么不是把stateDstream中的每个RDD直接拿去保存到MySQL中,还要调用rdd.repartition(3)对这些RDD重新设置分区数为3呢?这是因为,每次保存RDD到MySQL中,都需要启动数据库连接,如果RDD分区数量太大,那么就会带来多次数据库连接开销,为了减少开销,就有必要把RDD的分区数量控制在较小的范围内,所以,这里就把RDD的分区数量重新设置为3。然后,对于每个RDD分区,就调用repartitionedRDD.foreachPartition(dbfunc),把每个分区的数据通过dbfunc保存到MySQL中,这时,传递给dbfunc的输入参数就是Iterator[(String,Int)]类型的records。