在Scala中使用from_json()来解析DataFrame

时间:2018-05-24 02:24:34

标签: json scala apache-spark dataframe

我在Spark DataFrame的一列中有一个JSON,如下所示:

ID|           Text|           JSON
------------------------------------------------------------------------------
1|             xyz|          [{"Hour": 1, "Total": 10, "Fail": 1}, {"Hour": 2, "Total": 40, "Fail": 4}, {"Hour": 3, "Total": 20, "Fail": 2}]

我使用以下架构

val schema = StructType(Array(StructField("Hour", IntegerType),
   StructField("Total", IntegerType), StructField("Fail", IntegerType))

我使用以下代码解析DataFrame并将JSON输出为多列

val newDF = DF.withColumn("JSON", from_json(col("JSON"), schema)).select(col("JSON.*"))
newDF.show()

上面的代码只解析了JSON中的一条记录。但是,我希望它能解析JSON中的所有记录。

输出如下:

Hour|       Total|       Fail|
-------------------------------
   1|          10|          1|
-------------------------------

但是,我希望输出如下:

Hour|       Total|       Fail|
-------------------------------
   1|          10|          1|
   2|          40|          4|
   3|          20|          2|
-------------------------------

有人可以,请告诉我。我错过了什么!!

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果我正确解释了您的示例数据,那么您的JSON列就是您发布的架构的一系列JSON元素。在应用from_json之前,您需要爆炸列,如下所示:

val df = Seq(
  (1, "xyz", Seq("""{"Hour": 1, "Total": 10, "Fail": 1}""",
                 """{"Hour": 2, "Total": 40, "Fail": 4}""",
                 """{"Hour": 3, "Total": 20, "Fail": 2}""")
  )).toDF("ID", "Text", "JSON")

import org.apache.spark.sql.types._

val jsonSchema = StructType(Array(
  StructField("Hour", IntegerType),
  StructField("Total", IntegerType),
  StructField("Fail", IntegerType)
))

df.
  withColumn("JSON", explode(col("JSON"))).
  withColumn("JSON", from_json(col("JSON"), jsonSchema)).
  select("JSON.*").
  show
// +----+-----+----+
// |Hour|Total|Fail|
// +----+-----+----+
// |   1|   10|   1|
// |   2|   40|   4|
// |   3|   20|   2|
// +----+-----+----+