首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中使用from_json()来解析DataFrame中的多行

在Scala中使用from_json()来解析DataFrame中的多行
EN

Stack Overflow用户
提问于 2018-05-24 10:24:34
回答 1查看 5.8K关注 0票数 3

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

代码语言:javascript
复制
ID|           Text|           JSON
------------------------------------------------------------------------------
1|             xyz|          [{"Hour": 1, "Total": 10, "Fail": 1}, {"Hour": 2, "Total": 40, "Fail": 4}, {"Hour": 3, "Total": 20, "Fail": 2}]

我正在使用以下架构

代码语言:javascript
复制
val schema = StructType(Array(StructField("Hour", IntegerType),
   StructField("Total", IntegerType), StructField("Fail", IntegerType))

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

代码语言:javascript
复制
val newDF = DF.withColumn("JSON", from_json(col("JSON"), schema)).select(col("JSON.*"))
newDF.show()

上面的代码只解析JSON中的一条记录。但是,我想让它解析JSON中的所有记录。

输出如下:

代码语言:javascript
复制
Hour|       Total|       Fail|
-------------------------------
   1|          10|          1|
-------------------------------

但是,我希望输出如下所示:

代码语言:javascript
复制
Hour|       Total|       Fail|
-------------------------------
   1|          10|          1|
   2|          40|          4|
   3|          20|          2|
-------------------------------

有没有人,请告诉我。我到底错过了什么!

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-05-24 11:46:12

如果我正确地解释了您的示例数据,那么您的JSON列是一系列带有已发布模式的JSON元素。在应用from_json之前,您需要分解列,如下所示:

代码语言:javascript
复制
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|
// +----+-----+----+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50500032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档