从 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 列中提取模式的主要内容,如果未能解决你的问题,请参考以下文章