有没有办法将 pyspark 数据帧的模式作为 pythonic 结构返回?

问题描述 投票:0回答:2

我有一个 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
递归来获取嵌套字段,但我想知道是否有直接方法来返回预期的输出。

python pyspark struct
2个回答
0
投票

您可以使用 .ie 获取 JSON 格式的架构

schema_out: Dict[str, Any] = df.schema.jsonValue()

稍后再使用

schema_in: StructType = StructType.fromJson(schema_out)

它包含所有嵌套字段并且可以序列化,这不是您正在寻找的吗?


0
投票

以下内容也可能有助于将模式显示为树。 (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)
© www.soinside.com 2019 - 2024. All rights reserved.