Apache spark 将嵌套json作为字符串加载

Apache spark 将嵌套json作为字符串加载,apache-spark,pyspark,Apache Spark,Pyspark,我有非常复杂和高度嵌套的json结构,作为字符串存储在配置单元表中 有没有办法为Spark定义一个只描述根元素的部分模式,这样我就可以将其中一个子结构作为一个字符串整体加载 为了澄清,这里是我的json的根元素: { "meta": {....}, "entry": [{..}, {...}] } 我不想为整个事情声明模式,只想为根元素meta和entry声明模式。然后我需要将条目提取为字符串数组,每个条目都是一个单独的json文档 在Spark 2.2中尝试了类似于下面的内容,但不幸的是它不

我有非常复杂和高度嵌套的json结构,作为字符串存储在配置单元表中

有没有办法为Spark定义一个只描述根元素的部分模式,这样我就可以将其中一个子结构作为一个字符串整体加载

为了澄清,这里是我的json的根元素:

{
"meta": {....},
"entry": [{..}, {...}]
}
我不想为整个事情声明模式,只想为根元素meta和entry声明模式。然后我需要将条目提取为字符串数组,每个条目都是一个单独的json文档

在Spark 2.2中尝试了类似于下面的内容,但不幸的是它不起作用

schema = StructType(
        [
            StructField("meta", StringType(), True),
            StructField("entry", ArrayType(StringType(), True), True)

        ]
    )

rdd = rdd_src.map(lambda row: str(row.json_payload))
bundle = spark.read.json(rdd, schema=schema, multiLine=True)

基本上,最终目标是从条目中获取一个字符串数组,每个字符串都是一个单独的json文档。我上面的代码不会抛出任何错误消息,但生成的数据框包含具有空值的行。

您的方法没有什么特别的错误,应该可以正常工作:

>>> spark.version
'2.2.1'
>>> 
>>> from pyspark.sql.types import *
>>> schema = StructType(
...         [
...             StructField("meta", StringType(), True),
...             StructField("entry", ArrayType(StringType(), True), T
... rue)
... 
...         ]
...     )
...     
>>> json = """{"meta": {"foo": "bar"}, "entry": [{"foo": "bar"}, {"bar": "foo"}]}"""
>>> 
>>> spark.read.schema(schema).json(sc.parallelize([json])).show()
+-------------+--------------------+
|         meta|               entry|
+-------------+--------------------+
|{"foo":"bar"}|[{"foo":"bar"}, {...|
+-------------+--------------------+

如果您得到空值,可能是因为包含meta或entry内容的文档不是有效的JSON,并且没有正确解析。

这很奇怪,您是对的,您的示例运行良好,完全符合我的预期。谢谢你的努力。