如何在一个列上分组并在其他列上最小化?

时间:2019-09-23 17:25:04

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

Input DataFrame

+----+---+----+--------+
|type|aud|code|priority|
+----+---+----+--------+
|   A| AA| qwe|       2|
|   B| AA| qwe|       1|
|   A| BB| qwe|       2|
|   B| BB| qwe|       1|
|   A| AA| jku|       2|
|   B| AA| jku|       1|
|   A| BB| jku|       2|
|   B| BB| jku|       1|
+----+---+----+--------+

Output DataFrame

+----+---+----+--------+
|type|aud|code|priority|
+----+---+----+--------+
|   B| AA| qwe|       1|
|   B| AA| jku|       1|
|   B| BB| qwe|       1|
|   B| BB| jku|       1|
+----+---+----+--------+

问题描述步骤:

  1. 首先在“ aud”列上进行分组

  2. 然后在每个组中的每个“代码”值在“优先级”列中找到其最小值

  3. 假设在AA组中,使用“优先级”列的代码“ qwe”的最小值为1,因此将其取出并过滤其他行。

我是pyspark的新手,所以任何人都可以使用窗口函数或任何其他优化的方法来告诉我如何做。感谢您的阅读。

1 个答案:

答案 0 :(得分:2)

如果您需要按“ aud”分组,然后找到“ code”的最小“优先级”,则可以按“ aud”和“ code”列进行分组,并找到最小的“ priority”。

window_spec = Window \
    .partitionBy("aud", "code") \
    .orderBy("priority")

res = df \
    .withColumn("row_num", row_number().over(window_spec)) \
    .where(col("row_num") == 1) \
    .drop("row_num")

res.show()

输出:

+----+---+----+--------+
|type|aud|code|priority|
+----+---+----+--------+
|   B| AA| jku|       1|
|   B| AA| qwe|       1|
|   B| BB| qwe|       1|
|   B| BB| jku|       1|
+----+---+----+--------+