【问题标题】:split Json array into two rows spark scala将 Json 数组拆分为两行 spark scala
【发布时间】:2020-12-06 06:42:02
【问题描述】:

我有一个这样的数据框:

root
 |-- runKeyId: string (nullable = true)
 |-- entities: string (nullable = true)
+--------+--------------------------------------------------------------------------------------------+ 
|runKeyId|entities                                                                                    |
+--------+--------------------------------------------------------------------------------------------+ 
|1       |{"Partition":[{"Name":"ABC"},{"Name":"DBC"}],"id":339},{"Partition":{"Name":"DDD"},"id":339}|

我想用 scala 来解释一下:

+--------+--------------------------------------------------------------------------------------------+
|runKeyId|entities                                                                                    |
+--------+--------------------------------------------------------------------------------------------+
|1       |{"Partition":[{"Name":"ABC"},{"Name":"DBC"}],"id":339}
+--------+--------------------------------------------------------------------------------------------+
|2       |{"Partition":{"Name":"DDD"},"id":339}
+--------+--------------------------------------------------------------------------------------------+

【问题讨论】:

  • 您是如何阅读文件的?它看起来像jsonl格式,那么你可以简单地阅读spark.read.json("json_path")自动将json分隔到行。
  • 这里输入我得到它作为一个字符串而不是 json
  • 你是如何读取输入 jsons 的数据的?
  • val parseDF = decompressDataDF .select($"_1.entities")
  • 我在这里提供了类似问题的答案。请看一下 - stackoverflow.com/a/63375812/4758823

标签: arrays json scala apache-spark


【解决方案1】:

看起来你没有有效的 JSON,所以先修复 JSON,然后你可以读取为 JSON 并将其分解如下。

val df = Seq(
  ("1", "{\"Partition\":[{\"Name\":\"ABC\"},{\"Name\":\"DBC\"}],\"id\":339},{\"Partition\":{\"Name\":\"DDD\"},\"id\":339}")
).toDF("runKeyId", "entities")
  .withColumn("entities", concat(lit("["), $"entities", lit("]"))) //fix the json 


val resultDF = df.withColumn("entities",
  explode(from_json($"entities", schema_of_json(df.select($"entities").first().getString(0))))
).withColumn("entities", to_json($"entities"))


resultDF.show(false)

输出:

+--------+----------------------------------------------------------------+
|runKeyId|entities                                                        |
+--------+----------------------------------------------------------------+
|1       |{"Partition":"[{\"Name\":\"ABC\"},{\"Name\":\"DBC\"}]","id":339}|
|1       |{"Partition":"{\"Name\":\"DDD\"}","id":339}                     |
+--------+----------------------------------------------------------------+

【讨论】:

  • 是否可以将结果作为 json 而不是字符串,因为它会影响进一步的逻辑
  • root |-- Id: 字符串 (nullable = true) |-- 实体: json (nullable = true)
  • 结果为json是什么意思,没有这种Json类型?你能分享你的输出应该是什么样子,或者输出模式吗?
  • 它是在 "[{\"Name\":\"ABC\"},{\"Name\":\"DBC\"}]" 中添加一个额外的 " " 使其成为一个字符串
  • @shreypavagadhi 这是因为您在分区中也有无效的 jason。其中第一个分区是数组类型,第二个是对象
猜你喜欢
  • 2021-09-03
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多