【问题标题】:Transform list in a dataframe (same row, different columns) in Pyspark在 Pyspark 中的数据框中转换列表(同一行,不同列)
【发布时间】:2025-11-23 22:30:01
【问题描述】:

我从数据框的列中得到一个列表:

list_recs = [row[0] for row in df_recs.select("name").collect()]

列表如下所示:

Out[243]: ['COL-4560', 'D65-2242', 'D18-4751', 'D68-3303']

我想将它转换为一个新的数据帧,该值在一个不同的列中。我试过这样做:

from pyspark.sql import Row
rdd = sc.parallelize(list_recs)
recs = rdd.map(lambda x: Row(SKU=str(x[0]), REC_01=str(x[1]), REC_02=str(x[2]), REC_03=str(x[3])))#, REC_04=str(x[4]), REC_0=str(x[5])))
schemaRecs = sqlContext.createDataFrame(recs)

但我得到的结果是:

+---+------+------+------+
|SKU|REC_01|REC_02|REC_03|
+---+------+------+------+
|  C|     O|     L|     -|
|  D|     6|     5|     -|
|  D|     1|     8|     -|
|  D|     6|     8|     -|
+---+------+------+------+

我想要什么:

+----------+-------------+-------------+-------------+
|SKU       |REC_01       |REC_02       |REC_03       |
+----------+-------------+-------------+-------------+
|  COL-4560|     D65-2242|     D18-4751|     D68-3303|
+----------+-------------+-------------+-------------+

我也尝试过spark.createDataFrame(lista_recs, StringType()),但所有项目都在同一列中。

提前谢谢你。

【问题讨论】:

    标签: apache-spark pyspark rdd


    【解决方案1】:

    定义schema并使用spark.createDataFrame()

    list_recs=['COL-4560', 'D65-2242', 'D18-4751', 'D68-3303']
    
    from pyspark.sql.functions import *
    from pyspark.sql.types import *
    
    schema = StructType([StructField("SKU", StringType(), True), StructField("REC_01", StringType(), True), StructField("REC_02", StringType(), True), StructField("REC_03", StringType(), True)])
    
    spark.createDataFrame([list_recs],schema).show()
    #+--------+--------+--------+--------+
    #|     SKU|  REC_01|  REC_02|  REC_03|
    #+--------+--------+--------+--------+
    #|COL-4560|D65-2242|D18-4751|D68-3303|
    #+--------+--------+--------+--------+
    

    【讨论】:

    • 效果很好,谢谢!我现在的问题是我的最终目标是遍历许多列表并将它们添加到数据框中,但是它们的列数不同。
    • 好的,请作为新问题打开(带有一些示例数据),以便所有社区成员能够查看并帮助解决问题。