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

PySpark中如何将指定嵌套字典转换为目标结构的DataFrame?

如何将嵌套字典转换为指定结构的Spark DataFrame

你遇到的问题核心是原始字典里的值结构不统一——有的是嵌套列表(对应多行),有的是单个列表(对应一行),直接用data_dict.items()传给createDataFrame的话,Spark没法自动识别要把嵌套列表拆分成两列,也处理不了结构不一致的情况。

这里有个简单直接的解决方案,先把数据处理成Spark能直接识别的扁平结构,再创建DataFrame:

步骤1:统一数据结构并扁平化

我们需要把每个ID对应的所有(cola, colb)配对都提取出来,不管原始值是嵌套列表还是单个列表:

from pyspark.sql import SparkSession

# 初始化SparkSession(如果还没创建的话)
spark = SparkSession.builder.appName("DictToDF").getOrCreate()

# 你的原始字典
data_dict = {1016070000000: [[15245438, 1198], [53273831, 1198]], 10160700000201: [53273831, 1197]}

# 生成扁平的元组列表,每个元组对应一行数据
flat_rows = []
for id_val, values in data_dict.items():
    # 检查当前值是否是单个列表(不是嵌套的),如果是就包一层变成嵌套列表
    if isinstance(values[0], int):
        values = [values]
    # 遍历每个(cola, colb)对,和ID组合成元组
    for cola, colb in values:
        flat_rows.append( (id_val, cola, colb) )

步骤2:创建DataFrame并展示

现在flat_rows里的每个元素都是(ID, cola, colb)的结构,直接传给createDataFrame就行,还可以指定schema让类型更严谨:

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

# 定义schema(可选,但推荐,避免Spark自动推断类型出错)
df_schema = StructType([
    StructField("ID", LongType(), nullable=False),
    StructField("cola", LongType(), nullable=False),
    StructField("colb", LongType(), nullable=False)
])

# 创建DataFrame
df = spark.createDataFrame(flat_rows, schema=df_schema)

# 查看结果
df.show()

运行后就能得到你想要的结构:

+-------------+--------+----+
|           ID|    cola|colb|
+-------------+--------+----+
|1016070000000|15245438|1198|
|1016070000000|53273831|1198|
|10160700000201|53273831|1197|
+-------------+--------+----+

更简洁的写法(用列表推导式)

如果喜欢更紧凑的代码,可以用列表推导式一步完成扁平化:

flat_rows = [
    (id_val, cola, colb)
    for id_val, values in data_dict.items()
    for cola, colb in (values if isinstance(values[0], list) else [values])
]

这样处理后,不管原始字典里的值是嵌套列表还是单个列表,都能被正确解析成你需要的三列DataFrame啦。

内容的提问来源于stack exchange,提问作者Nithyananda Shetty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:47:25