如何在Apache Spark中爆炸JSON数组

时间:2018-09-17 15:48:27

标签: apache-spark apache-spark-sql

给出一个带有包含JSON数组的列的spark 2.3 DataFrame,如何将其转换为JSON字符串的Spark数组?或者,等效地,我该如何分解JSON,这样输入以下内容:

myJsonColumn
"""[{"a":1},{"b":2}]"""
"""[{"c":3},{"d":4}]"""
"""[{"e":3},{"f":4},{"g":{"h":1}}]"""

我得到:

myExplodedJson
"""{"a":1}"""
"""{"b":2}"""
"""{"c":3}"""
"""{"d":4}"""
"""{"e":3}"""
"""{"f":4}"""
"""{"g":{"h":1}}"""

非常感谢!

p.s。数组中条目的形状是可变的。

如果有用,这里是一个示例输入:

List("""[{"a":1},{"b":2}]""", """[{"c":3},{"d":4}]""", """[{"e":3},{"f":4},{"g":{"h":1}}]""").toDF.show

p.p.s。这与到目前为止所有建议的重复问题都不同。问题和解决方案,例如How to query JSON data column using Spark DataFrames?适用于(1)数据全部为JSON数据的情况,因此可以将整个数据帧读取为JSON。这不适用于此问题,例如数据可以是CSV,并且只有一列包含JSON字符串。这与查询是对特定键的查询的情况也有所不同,该查询实际上由get_json_object覆盖。它也不同于数组中元素的数量有界的情况,因此仅查找前100个数组索引,然后丢弃null可能是可以接受的,但即使这样,仅当在数组中没有null时才适用原始JSON数组。

p.p.s。需要的是类似postgres中的json_array_elements的东西。我的后盾是编写一个采用JSON字符串并返回spark数组的UDF,但是UDF往往比内置函数慢,并且爆炸的JSON可能是Spark的核心功能。为什么要重塑基础知识?

1 个答案:

答案 0 :(得分:0)

您可以将explodearray功能一起使用。

在Spark 2.3.1中,您可以-

val df = List("""[{"a":1},{"b":2}]""", """[{"c":3},{"d":4}]""", """[{"e":3},{"f":4},{"g":{"h":1}}]""").toDF

df.withColumn("value", explode(array(
  get_json_object($"value", "$[0]"),
  get_json_object($"value", "$[1]")
))).show

此输出为-

+-------+
|  value|
+-------+
|{"a":1}|
|{"b":2}|
|{"c":3}|
|{"d":4}|
|{"e":3}|
|{"f":4}|
+-------+