将spark结构化流数据帧转换为JSON

时间:2017-12-20 13:46:03

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

我正在使用具有以下结构的火花结构流来阅读流:

col1
col2
col3

经过一些转换后,我想以json格式将数据帧写入控制台。我正在尝试以下方法:

df.select(to_json($"*"))
      .writeStream
      .outputMode("append")
      .format("console")
      .start()

但我得到Invalid usage of '*' in expression 'structstojson';

有没有办法将所有行合并到同一列中才能使用to_json

预期输出是一个数据帧,其中一列在每行上都有json数据:

{"col1":"val11","col2":"val12","col3":"val13"}
{"col1":"val21","col2":"val22","col3":"val23"}

2 个答案:

答案 0 :(得分:5)

to_json有以下定义:

def to_json(e: org.apache.spark.sql.Column): org.apache.spark.sql.Column
def to_json(e: org.apache.spark.sql.Column,options: java.util.Map[String,String]): org.apache.spark.sql.Column
def to_json(e: org.apache.spark.sql.Column,options: Map[String,String]): org.apache.spark.sql.Column

这是我们的数据框:

df.show
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   a|   b|   c|
|   d|   e|   f|
+----+----+----+

您需要创建struct,然后在其上调用to_json。类似的东西:

df.select(to_json( struct( df.columns.map(col(_)):_*  ) )  as "json").show(false)
+----------------------------------+
|json                              |
+----------------------------------+
|{"col1":"a","col2":"b","col3":"c"}|
|{"col1":"d","col2":"e","col3":"f"}|
+----------------------------------+

答案 1 :(得分:0)

这是一种更直接的方法:

df.toJSON.writeStream
    .queryName("aakriti")
    .outputMode("append")
    .format("console")
    .option("numRows", "1000")
    .option("truncate", false)
    .start();