Apache spark RDD toDF():错误行为

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

我构建了一个SparkStreaming应用程序,它从Kafka队列获取内容,并打算在一些预处理和结构化之后将数据放入MySQL表中

我在SparkStreamingContext上调用'foreachRDD'方法。我面临的问题是,在RDD上调用saveAsTextFile和DataFrame的write format方法(“csv”)之间存在数据丢失。我似乎无法确定发生这种情况的原因

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。