pyspark 从StructType列获取数据类型

disho6za  于 2023-11-16  发布在  Spark
关注(0)|答案(1)|浏览(110)

我正在从S3阅读Avro文件。我试图将其写入delta文件。我有以下模式

|--test: struct
   |--test2: struct
      |--test3: struct

字符串
当我跑步时:

print(df.schema['test'].dataType)


我得到了正确的输出,但是当我运行

print(df.schema['test.test2'].dataType)


我得到以下错误:

'No StructField named test.test2'


我需要获取struct schema,因为有时spark会推断某些struct列是字符串,因为它们是空的。我试图做的是验证列类型是StringType还是StructureType。然而,就像我之前说的,我无法获取嵌套结构的数据类型。
我的疑问是:有没有可能不迭代就得到嵌套列结构的数据类型?如果没有,最好的方法是什么?

6ovsh4lw

6ovsh4lw1#

要将嵌套的StructType作为对象访问,请在目标列的 selection 上使用schema属性。
示例(假设有一些data):

from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([
    StructField('name', StructType([
        StructField('firstname', StringType(), True),
        StructField('middlename', StringType(), True),
        StructField('lastname', StringType(), True)
    ])),
    StructField('state', StringType(), True),
    StructField('gender', StringType(), True)
])

df = spark.createDataFrame(data=data, schema=schema)
# df.printSchema()
print(df.select('name.firstname').schema)

个字符
要获取具体StructField的内部数据类型,请使用以下访问方案:

print(df.select('name.firstname').schema['firstname'].dataType)
StringType()

的字符串

相关问题