结构化流以将JSON保存到HDFS

时间:2019-07-27 11:55:55

标签: java apache-spark apache-kafka hdfs spark-streaming-kafka

我的结构化Spark Streaming程序是从Kafka读取JSON数据 并以JSON格式写入HDFS。我可以将JSON保存到HDFS,但是 它将JSON字符串保存为:

 "jsontostructs(CAST(value AS STRING))"
key as below: {"jsontostructs(CAST(value AS STRING))":{"age":42,"name":"John"}}.

仅保存方式

{"age":42,"name":"John"}?




StructType schema = kafkaPrimerRow.schema();

//Read json from kafka. JSON is: {"age":42,"name":"John"}
Dataset<Row> df = spark
                    .readStream()
                    .format("kafka")
                    .option("kafka.bootstrap.servers", input_bootstrap_server)
                    .option("subscribe", topics[0])
                    .load();




    //Save Stream to HDFS
    StreamingQuery ds = df             
.select(functions.from_json(col("value").cast(DataTypes.StringType),schema)) 
.writeStream()

.format("json")
.outputMode(OutputMode.Append())
.option("path", destPath)
.option("checkpointLocation", checkpoint)
.start();

1 个答案:

答案 0 :(得分:0)

以下.select(“ data。*”)可以达到目的。

StreamingQuery ds = df
                        .select(functions.from_json(col("value").cast(DataTypes.StringType),schema).as("data"))
                        .select("data.*")
                        .writeStream()
                        .format("json")
                        .outputMode(OutputMode.Append())
                        .option("path", destPath)
                        .option("checkpointLocation", checkpoint)
                        .start();