从 Pyspark 中的嵌套 Json-String 列中提取模式

Posted

技术标签:

【中文标题】从 Pyspark 中的嵌套 Json-String 列中提取模式【英文标题】:Extract Schema from nested Json-String column in Pyspark 【发布时间】:2021-11-03 16:38:25 【问题描述】:

假设我有下表:

body
"Day":1,"vals":["id":"1", "val":"3", "id":"2", "val":"4"]

我的目标是在 Pyspark 中为这个嵌套的 json 列写下模式。我尝试了以下两件事:

schema = StructType([
  StructField("Day", StringType()),
  StructField(
  "vals",
  StructType([
    StructType([
      StructField("id", StringType(), True),
      StructField("val", DoubleType(), True)
    ])
    StructType([
      StructField("id", StringType(), True),
      StructField("val", DoubleType(), True)
    ])
  ])
  )
])

这里我得到的错误是

'StructType' object has no attribute 'name'

另一种方法是将嵌套数组声明为 ArrayType:

schema = StructType([
  StructField("Day", StringType()),
  StructField(
  "vals",
  ArrayType(
    ArrayType(
        StructField("id", StringType(), True),
        StructField("val", DoubleType(), True)
      , True)
    ArrayType(
        StructField("id", StringType(), True),
        StructField("val", DoubleType(), True)
      , True)
    , True)
  )
])

这里出现以下错误:

takes from 2 to 3 positional arguments but 5 were given

这可能来自仅将 Sql 类型作为参数的数组。

谁能告诉我他们创建架构的方法是什么,因为我是整个主题的超级新手..

【问题讨论】:

【参考方案1】:

这是您正在寻找的结构:

Data = [
    (1, [("1","3"), ("2","4")])
  ]

schema = StructType([
        StructField('Day', IntegerType(), True),
        StructField('vals', ArrayType(StructType([
            StructField('id', StringType(), True),
            StructField('val', StringType(), True)
            ]),True))
         ])
df = spark.createDataFrame(data=Data,schema=schema)
df.printSchema()
df.show(truncate=False)

这将为您提供下一个输出:

root
 |-- Day: integer (nullable = true)
 |-- vals: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- id: string (nullable = true)
 |    |    |-- val: string (nullable = true)

+---+----------------+
|Day|vals            |
+---+----------------+
|1  |[1, 3, 1, 3]|
+---+----------------+

【讨论】:

感谢您的回答!我看到我在创建示例表时犯了一个错误。两种结构类型都属于同一个结构域“vals”。我仍然没有真正找到解决方案.. 我的错,我以为你只是缺少第二个嵌套 StructType 的名称。检查我的新答案!希望对你有帮助

以上是关于从 Pyspark 中的嵌套 Json-String 列中提取模式的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套的 Json 转换为 Pyspark 中的数据框

Pyspark:合并嵌套列表中的值

如何使用pyspark从xml的每个嵌套节点创建一个表

Pyspark DataFrames 中的嵌套 SELECT 查询

pyspark中的未嵌套列表

使用 spark-xml 从 pyspark 数据框中选择嵌套列