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
相关产品推荐
相关产品推荐

