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

PySpark:如何从含列表值的字典创建指定结构的DataFrame

PySpark 字典转指定结构DataFrame的最优实现

核心思路

将字典的键作为第一列值,对应值列表中的两个子列表分别作为第二、第三列值,本质是把每个键值对拆分为(键, 子列表1, 子列表2)的结构,再转换为DataFrame。

方法一:直接构造元组列表创建(性能最优)

通过列表推导式将字典转换为符合要求的元组集合,一步创建目标DataFrame,避免额外列操作开销:

from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder.appName("DictToDF").getOrCreate()

# 定义目标字典
data_dict = {
    'xy': [['value1', 'value2'], ['value3', 'value4']],
    'yx': [['value5', 'value6'], ['value7', 'value8']]
}

# 转换为(键, 第一个子列表, 第二个子列表)的元组列表
data_tuples = [(key, vals[0], vals[1]) for key, vals in data_dict.items()]

# 创建DataFrame并指定列名
df = spark.createDataFrame(data_tuples, schema=["key_col", "list_col1", "list_col2"])

# 查看结果
df.show(truncate=False)

输出结果:

+-------+----------------+----------------+
|key_col|list_col1       |list_col2       |
+-------+----------------+----------------+
|xy     |[value1, value2]|[value3, value4]|
|yx     |[value5, value6]|[value7, value8]|
+-------+----------------+----------------+

方法二:先创建临时DF再拆分列(灵活扩展)

如果需要处理更复杂的嵌套结构,可先创建包含键和完整值列表的临时DataFrame,再通过索引拆分出目标列:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col

spark = SparkSession.builder.appName("DictToDF").getOrCreate()

data_dict = {
    'xy': [['value1', 'value2'], ['value3', 'value4']],
    'yx': [['value5', 'value6'], ['value7', 'value8']]
}

# 创建包含键和值列表的临时DF
temp_df = spark.createDataFrame(data_dict.items(), schema=["key_col", "value_list"])

# 拆分值列表为两列,删除临时列
df = temp_df.withColumn("list_col1", col("value_list")[0]) \
            .withColumn("list_col2", col("value_list")[1]) \
            .drop("value_list")

df.show(truncate=False)

方案对比

  • 方法一:直接构造元组,无需Spark额外的列转换操作,性能更优,适合固定结构的字典转换。
  • 方法二:通过列操作拆分,扩展性更强,若后续值列表中子列表数量变化,只需调整索引即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:30:43