我在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行。
答案 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)
}
})