给出一个带有包含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的核心功能。为什么要重塑基础知识?
答案 0 :(得分:0)
您可以将explode
与array
功能一起使用。
在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}|
+-------+