【问题标题】:Pyspark Pivot based on column values combinationsPyspark Pivot 基于列值组合
【发布时间】:2022-01-14 22:05:02
【问题描述】:

我有一个包含 3 列的数据框,如下所示

我想旋转并填充 id 上的列,以便每一行都包含一个 每个 id + 列组合的列,其中值是该 id 的值,如下所示

注意:如果ID 不匹配,则显示零或空值。例如ID2_colAId2_ColB在前两行得到0,ID1_calAabdID1_ColB在第3行得到0 ID 列中有更多不同的值。为了便于说明而缩短了它

如何在 pyspark 中实现这一点?

这是第一个数据帧的代码:

data = [(("ID1", 3, 5)), (("ID1", 4, 12)), (("ID2", 8, 3))]
df = spark.createDataFrame(data, ["ID", "colA", "colB"])

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以创建一个映射列,其中值是列colAcolB,键连接文字colAcolB 名称与IDcolumn。然后,分解地图并旋转生成的 value 列,如下所示:

    from itertools import chain
    import pyspark.sql.functions as F
    
    df.select(
        "ID", "colA", "colB",
        F.explode(
            F.create_map(
                *list(chain(*[[F.concat_ws("_", F.lit(c), F.col("ID")), F.col(c)] for c in ["colA", "colB"]]))
            )
        )
    ).groupBy("ID", "colA", "colB") \
        .pivot("key").agg(F.first("value")) \
        .fillna(0) \
        .show()
    
    #+---+----+----+--------+--------+--------+--------+
    #|ID |colA|colB|colA_ID1|colA_ID2|colB_ID1|colB_ID2|
    #+---+----+----+--------+--------+--------+--------+
    #|ID2|8   |3   |0       |8       |0       |3       |
    #|ID1|3   |5   |3       |0       |5       |0       |
    #|ID1|4   |12  |4       |0       |12      |0       |
    #+---+----+----+--------+--------+--------+--------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2016-09-25
      • 2023-03-27
      • 1970-01-01
      • 2020-12-18
      相关资源
      最近更新 更多