RDD toDF():错误行为

时间:2016-10-27 07:21:05

标签: apache-spark spark-streaming spark-dataframe

我构建了一个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的行都会被复制多次。

1 个答案:

答案 0 :(得分:0)

发现错误。实际上对摄取的数据格式有一个错误的理解。

目标数据为" \ t \ t \ t \ t ..."因此,Row应该在" \ n"分开。

然而实际数据是: " \吨\吨\吨... \ n \吨\吨\吨... \ n"

所以rdd.map(...)操作需要另一个地图来分割每个" \ n"