You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark嵌套列提取后错误转换为字符串类型的问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:00:28