Apache spark RDD toDF():错误行为
我构建了一个SparkStreaming应用程序,它从Kafka队列获取内容,并打算在一些预处理和结构化之后将数据放入MySQL表中 我在SparkStreamingContext上调用'foreachRDD'方法。我面临的问题是,在RDD上调用saveAsTextFile和DataFrame的write format方法(“csv”)之间存在数据丢失。我似乎无法确定发生这种情况的原因Apache spark RDD toDF():错误行为,apache-spark,spark-streaming,spark-dataframe,Apache Spark,Spark Streaming,Spark Dataframe,我构建了一个SparkStreaming应用程序,它从Kafka队列获取内容,并打算在一些预处理和结构化之后将数据放入MySQL表中 我在SparkStreamingContext上调用'foreachRDD'方法。我面临的问题是,在RDD上调用saveAsTextFile和DataFrame的write format方法(“csv”)之间存在数据丢失。我似乎无法确定发生这种情况的原因 val ssc = new StreamingContext(spark.sparkContext, Seco
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传输到数据帧。
还有复制:许多到达数据帧的行被复制了很多次 找到了错误。实际上,对摄取的数据格式有一个错误的理解 预期的数据是“\t\t\t…”,因此该行应该在“\n”处拆分 然而,实际数据是: “\t\t\t..\n\t\t\t..\n”
因此rdd.map(…)操作需要在每个“\n”处使用另一个映射进行拆分,您可以做的是,首先将
rdd
转换为df
,然后您可以将相同的df写入csv
以及text
文件。要将df保存到文本文件,请尝试df.write.text(“文件路径”)
此外,您还可以在写入CSV和文本文件之前缓存
df。