PySpark嵌套列提取后错误转换为字符串类型的问题求助
大家好,我最近在处理PySpark数据集时遇到了一个棘手的问题,想请教一下各位大佬。
我的数据集里每一列都是嵌套结构,包含string_value和int_value两个字段。每个列只会填充其中一个字段(另一个为null),而且同一列的有效字段类型是固定的,但我没办法提前知道哪些列对应字符串类型、哪些对应整数类型(下面的例子是简化后的场景)。
我尝试提取嵌套列里的有效值并转换为正确的类型,但执行后发现所有提取后的列都变成了字符串类型,完全不符合预期。
先给大家展示我的代码和输出结果:
定义Schema与创建DataFrame的代码
from pyspark.sql.types import DoubleType, LongType, StringType, StructType, StructField from pyspark.sql import Row import pyspark.sql.functions as F schema = StructType([ StructField("id", StringType(), True), StructField("string_col", StructType([ StructField("string_value", StringType(), True), StructField("int_value", LongType(), True) ]), True), StructField("integer_col", StructType([ StructField("string_value", StringType(), True), StructField("int_value", LongType(), True) ]), True) ]) df = spark.createDataFrame( [ Row(id='01', string_col=Row(string_value='A', int_value=None), integer_col=Row(string_value=None, int_value=65)), Row(id='02', string_col=Row(string_value='B', int_value=None), integer_col=Row(string_value=None, int_value=101)), Row(id='03', string_col=Row(string_value='C', int_value=None), integer_col=Row(string_value=None, int_value=384)) ], schema) df.printSchema()
这段代码输出的Schema如下:
root
|-- id: string (nullable = true)
|-- string_col: struct (nullable = true)
| |-- string_value: string (nullable = true)
| |-- int_value: long (nullable = true)
|-- integer_col: struct (nullable = true)
| |-- string_value: string (nullable = true)
| |-- int_value: long (nullable = true)
尝试提取列的代码
for expanded_col in ['string_col', 'integer_col']: df = (df.withColumn(expanded_col, F.when(F.col(expanded_col + '.int_value').isNotNull(), F.col(expanded_col + '.int_value').cast(IntegerType())) .otherwise(F.col(expanded_col + '.string_value')))) df.printSchema()
但执行后输出的Schema里,原本预期是整数类型的integer_col也变成了字符串类型:
root
|-- id: string (nullable = true)
|-- string_col: string (nullable = true)
|-- integer_col: string (nullable = true)
有没有大佬能帮我分析下问题出在哪?要怎么修改才能让提取后的列保持对应的正确数据类型呢?
备注:内容来源于stack exchange,提问作者Veronika Vrana

