基于列值组合的 Pyspark Pivot
Pyspark Pivot based on column values combinations
我有一个包含 3 列的数据框,如下所示
我想旋转并填充 id 上的列,以便每行包含一个
每个 id + 列组合的列,其中值是该 id 的值,如下所示
注意:如果 ID
不匹配,则显示零或 Null。例如 ID2_colA
和 Id2_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"])
您可以创建一个映射列,其中值是列 colA
和 colB
以及文字 colA
和 colB
名称与 [=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 |
#+---+----+----+--------+--------+--------+--------+
我有一个包含 3 列的数据框,如下所示
我想旋转并填充 id 上的列,以便每行包含一个 每个 id + 列组合的列,其中值是该 id 的值,如下所示
注意:如果 ID
不匹配,则显示零或 Null。例如 ID2_colA
和 Id2_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"])
您可以创建一个映射列,其中值是列 colA
和 colB
以及文字 colA
和 colB
名称与 [=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 |
#+---+----+----+--------+--------+--------+--------+