我有一个 Pyspark Dataframe 并且
df.schema.fields
返回此:
[StructField(Id,StringType,true),
StructField(Sub_l1,DoubleType,true),
StructField(Detail,ArrayType(StructType(List(StructField(Sub_l5,StringType,true))),false),true)]
有没有办法让 pyspark 返回一个我可以存储和稍后重用的 Pythonic 模式,如下所示:
schema = StructType([
StructField("Id", StringType(),True),
StructField("Sub_l1", DoubleType(),True),
StructField("Detail", ArrayType(StructType([StructField("Sub_l5", StringType(), True)]), False), True)
])
我在这里看到了很多答案,但我找不到自动生成模式的 Pythonic 版本的方法。也许我错过了一些明显的东西 - 我查看了
printSchema()
、df.dtypes
,迭代 df.schema.fields
并获取名称、数据类型等(但缺少嵌套字段)、json 方法和 pyspark 文档中的模式方法。如果归根结底,我知道我们也可以通过 df.schema.fields
递归来获取嵌套字段,但我想知道是否有直接方法来返回预期的输出。
您可以使用 .ie 获取 JSON 格式的架构
schema_out: Dict[str, Any] = df.schema.jsonValue()
稍后再使用
schema_in: StructType = StructType.fromJson(schema_out)
它包含所有嵌套字段并且可以序列化,这不是您正在寻找的吗?
以下内容也可能有助于将模式显示为树。 (Python代码)
e = StructType(......)
def showstruct(e, l:int=0):
lead = ('| '*l).strip()
if type(e) is StructType:
for n in e.fields:
showstruct(n, l+1)
if type(e) is StructField:
sepa = ' -- ' if type(e.dataType) is not StructType else "> "
dtype = f" : {type(e.dataType).__name__.replace('Type','')}" if type(e.dataType) is not StructType else " "
print(f"{lead}{sepa}{e.name}{dtype}")
showstruct(e.dataType, l+1)
showstruct(e)