基于列值组合的 Pyspark Pivot

Pyspark Pivot based on column values combinations

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

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

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

我如何在 pyspark 中实现这一点?

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

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

您可以创建一个映射列,其中值是列 colAcolB 以及文字 colAcolB 名称与 [=15= 的键串联]柱子。然后,展开地图并旋转生成的 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       |
#+---+----+----+--------+--------+--------+--------+