如何将含列表值的Python字典转换为多行PySpark DataFrame
将字典转换为指定结构的PySpark DataFrame
步骤1:初始化SparkSession
先创建PySpark的核心会话对象,这是所有操作的基础:
from pyspark.sql import SparkSession from pyspark.sql.functions import arrays_zip, explode, col spark = SparkSession.builder.appName("dict_to_spark_df").getOrCreate()
步骤2:定义字典并生成初始DataFrame
把目标字典转换成单行的PySpark DataFrame:
my_dict = {'z': 'some_string', 'y':'some_other_string', 'a': [1,2,3], 'b': [4,5,6]} # 生成仅含一行的初始DataFrame df = spark.createDataFrame([my_dict])
步骤3:拆分列表列并保留重复值
利用arrays_zip把长度匹配的列表列a和b按位置配对,再用explode将配对后的数组拆分成多行,最后提取需要的列:
# 打包列表列→拆分成多行→提取目标列 df_result = df.withColumn("zipped_cols", arrays_zip(col("a"), col("b"))) \ .withColumn("zipped_cols", explode(col("zipped_cols"))) \ .select( col("zipped_cols.a").alias("a"), col("zipped_cols.b").alias("b"), col("z"), col("y") )
查看最终结果
执行df_result.show()就能得到你需要的结构:
+---+---+-----------+-----------------+ | a| b| z| y| +---+---+-----------+-----------------+ | 1| 4|some_string|some_other_string| | 2| 5|some_string|some_other_string| | 3| 6|some_string|some_other_string| +---+---+-----------+-----------------+
补充说明
这个方法适用于列表列长度一致的场景,arrays_zip会按索引将两个列表的元素一一绑定,explode则把每一组绑定元素拆成单独一行,非列表类型的z、y值会自动在每一行重复显示。如果后续遇到列表长度不一致的情况,可以根据需求补全短列表或过滤不匹配的行来调整逻辑。
内容的提问来源于stack exchange,提问作者KarlS
相关产品推荐
相关产品推荐

