Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在ApacheSpark中分解JSON数组_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 如何在ApacheSpark中分解JSON数组

Apache spark 如何在ApacheSpark中分解JSON数组,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,给定一个spark 2.3数据帧,其列包含JSON数组,如何将其转换为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}"""

给定一个spark 2.3数据帧,其列包含JSON数组,如何将其转换为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、 数组中条目的形状是可变的

以下是一个示例输入,以防有用:

List("""[{"a":1},{"b":2}]""", """[{"c":3},{"d":4}]""", """[{"e":3},{"f":4},{"g":{"h":1}}]""").toDF.show
p、 另外,这与目前为止所有建议的重复问题不同。例如,当(1)数据都是JSON数据时,问题和解决方案适用,因此整个数据帧可以作为JSON读入。这不适用于此问题,例如,数据可以是包含JSON字符串的单个列的CSV。这与查询是特定键的查找的情况也不同,get_json_对象确实涵盖了特定键的查找。它也不同于数组中元素数有界的情况,因此只查找前100个(比如数组索引)然后丢弃空值可能是可以接受的,但即使如此,这也仅适用于原始JSON数组中没有空值的情况


p、 另外,需要的是类似postgres中的json_数组_元素。我的后盾是编写一个UDF,它接受JSON字符串并返回一个spark数组,但UDF往往比内置的要慢,而扩展JSON很可能是spark的核心功能。为什么要重新发明基本功能?

您可以将
分解
数组
功能结合使用

在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}|
+-------+

你希望{“g”:{“h”:1}@Michael JSON序列化的输出是什么?g:{h示例是为了强调模式不是常数。:-。键会随着其他键的变化而变化,但它们仍然可以表示为一个映射。每个输入都是一个包含未指定内容的JSON数组。相应的输出应该是一个包含编码“stuff”的spark数组@Michael谢谢你的链接。我已经阅读了这两个链接,但都没有解决问题。我问Tzach是否有任何更新,以防他知道更新函数启用的更好的方法。如果每个数组中的元素数始终相同,那就太好了。如果元素数可变,该怎么办ents?有一种蛮力方法-只需获得前100个,希望永远不会超过100个,然后过滤掉空值-但这有很多缺点。@MaxMurphy您的数据总是有单键JSON吗?类似于-“[{a:1},{b:2},{p:5},…”?不。数组元素的结构是可变的。