我构建了一个SparkStreaming App,它从A Kafka Queue中获取内容,并打算在经过一些预处理和结构化之后将数据放入MySQL表中。
我在SparkStreamingContext上调用'foreachRDD'方法。我面临的问题是,当我在RDD上调用saveAsTextFile和使用格式(“csv”)调用DataFrame的write方法之间存在数据压缩。我似乎无法确定为什么会发生这种情况。
val ssc = new StreamingContext(spark.sparkContext, Seconds(60))
ssc.checkpoint("checkpoint")
val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap
val stream = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).map(_._2)
stream.foreachRDD {
rdd => {
rdd.saveAsTextFile("/Users/jarvis/rdds/"+new SimpleDateFormat("hh-mm-ss-dd-MM-yyyy").format(new Date)+"_rdd")
import spark.implicits._
val messagesDF = rdd.map(_.split("\t")).map( w => { Record ( w(0), autoTag( w(1),w(4) ) , w(2), w(3), w(4), w(5).substring(w(5).lastIndexOf("http://")), w(6).split("\n")(0) )}).toDF("recordTS","tag","channel_url","title","description","link","pub_TS")
messagesDF.write.format("csv").save(dumpPath+new SimpleDateFormat("hh-mm-ss-dd-MM-yyyy").format(new Date)+"_DF")
}
}
ssc.start()
ssc.awaitTermination()
存在数据丢失,即许多行无法从RDD进入DataFrame。 还有复制:许多到达Dataframe的行都会被复制多次。
答案 0 :(得分:0)
发现错误。实际上对摄取的数据格式有一个错误的理解。
目标数据为" \ t \ t \ t \ t ..."因此,Row应该在" \ n"分开。
然而实际数据是: " \吨\吨\吨... \ n \吨\吨\吨... \ n"
所以rdd.map(...)操作需要另一个地图来分割每个" \ n"