json - 如何在spark scala中将json字符串解析到不同的列?

标签 json scala apache-spark apache-spark-sql

读取 Parquet 文件时,这是以下文件数据

|id |name |activegroup|

|1  |abc  |[{"groupID":"5d","role":"admin","status":"A"},{"groupID":"58","role":"admin","status":"A"}]|

各字段的数据类型

|--id : int
|--name : String
|--activegroup : String

activegroup 列是字符串,爆炸功能不起作用。以下是所需的输出

|id |name |groupID|role|status|
|1  |abc  |5d     |admin|A    |
|1  |def  |58     |admin|A    |

请帮我在 Spark scala 最新版本中解析上述内容

最佳答案

首先您需要提取 json 架构:

  val schema = schema_of_json(lit(df.select($"activeGroup").as[String].first))

获得后,您可以将 activegroup 列(字符串)转换为 json (from_json),然后分解它。

一旦列是 json,您就可以使用 $"columnName.field"提取其值

  val dfresult = df.withColumn("jsonColumn", explode(
                                      from_json($"activegroup", schema)))
                   .select($"id", $"name",
                           $"jsonColumn.groupId" as "groupId", 
                           $"jsonColumn.role" as "role", 
                           $"jsonColumn.status" as "status")

如果你想提取整个 json 并且元素名称对你来说没问题,你可以使用 * 来做到这一点:

val dfresult = df.withColumn("jsonColumn", explode(
                               from_json($"activegroup", schema)))
            .select($"id", $"name", $"jsonColumn.*")

结果

+---+----+-------+-----+------+
| id|name|groupId| role|status|
+---+----+-------+-----+------+
|  1| abc|     5d|admin|     A|
|  1| abc|     58|admin|     A|
+---+----+-------+-----+------+

关于json - 如何在spark scala中将json字符串解析到不同的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61173158/

相关文章:

具有依赖类型的 Scala 自类型

scala - 使用 Akka actors 进行异常处理

apache-spark - 偏好、存储桶或重新分区是什么?

sql - Apache Spark 中的授权

apache-spark - 使用 pyspark 读取 Elasticsearch 失败,异常 java.lang.NoClassDefFoundError : org/apache/commons/httpclient/protocol/ProtocolSocketFactory

json - 将 JSON 结构附加到 JSON 文件 Golang

sql - 使用通配符的 OpenJson

json - F# "Code is not sufficiently generic" "^T could not be generalized"实现接口(interface)时

Scala JSON 差异

javascript - 如何使用 JavaScript 编辑本地 JSON 文件