读取 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/