如何存储来自kafka的JSONLines RDD消息

时间:2018-12-27 10:58:28

标签: json scala apache-spark apache-spark-sql rdd

我在kafka中收到1条消息,其中包含几条独立的json行。我想将此消息流式传输到hdfs。问题是,我的代码只保存了第一个json,而忽略了其余的。

示例1个kafka消息(不包含多条消息):

{"field": "1"}
{"field": "2"}
{"field": "3"}

scala代码的一部分:

 val stream = KafkaSource.kafkaStream[String, String, StringDecoder, StringDecoder](
      streamingContext, brokers, new ZooKeeperOffsetsStore(zkQuorum, zkPath), topic)
    stream.foreachRDD(rdd => {
      if (!rdd.isEmpty) {

        val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate()

        val df = spark.sqlContext.read.format(rdd.map(m => m._2))

        df.write.mode(SaveMode.Append).format("json").save(outputPath)
      }

    })

特定的解决方案在于rdd.map(m => m._2)部分,在这里我需要映射所有行,而不仅仅是第一行。在我看来rdd本身已被剪切,并且不包含其余的json行。

1 个答案:

答案 0 :(得分:0)

我通过使用文本而不是json解决了它。主要区别在于toDF()转换:

stream.foreachRDD(rdd => {

      if (!rdd.isEmpty) {        
        //works as .txt file: 
        rdd.map(m => m._2).toDF().coalesce(1).write.mode(SaveMode.Append).format("text").save(outputPath)


      }
    })