Pyspark:无需聚合即可重塑数据

Pyspark: reshape data without aggregation

我想在不聚合的情况下在 pyspark 中将我的数据从 4x3 重塑为 2x2。我当前的输出如下:

columns = ['FAULTY', 'value_HIGH', 'count']
vals = [
    (1, 0, 141),
    (0, 0, 140),
    (1, 1, 21),
    (0, 1, 12)
]

我想要的是一个意外事件 table,第二列作为两个新的二进制列(value_HIGH_1value_HIGH_0)和 count 列中的值 -含义:

columns = ['FAULTY', 'value_HIGH_1', 'value_HIGH_0']
vals = [
    (1, 21, 141),
    (0, 12, 140)
]

您可以将 pivot 假最大聚合 一起使用(因为每个组只有一个元素):

import pyspark.sql.functions as F
df.groupBy('FAULTY').pivot('value_HIGH').agg(F.max('count')).selectExpr(
    'FAULTY', '`1` as value_high_1', '`0` as value_high_0'
).show()
+------+------------+------------+
|FAULTY|value_high_1|value_high_0|
+------+------------+------------+
|     0|          12|         140|
|     1|          21|         141|
+------+------------+------------+

使用 groupbypivot,但如果您想避免任何聚合,您可以使用 filterjoin

来实现
import pyspark.sql.functions as f

df.where("value_HIGH = 1").select("FAULTY", f.col("count").alias("value_HIGH_1"))\
    .join(
        df.where("value_HIGH = 0").select("FAULTY", f.col("count").alias("value_HIGH_1")),
        on="FAULTY"
    )\
    .show()
#+------+------------+------------+
#|FAULTY|value_HIGH_1|value_HIGH_1|
#+------+------------+------------+
#|     0|          12|         140|
#|     1|          21|         141|
#+------+------------+------------+