在pyspark中找到具有多列的数据框中的最大值
finding the max in a dataframe with multiple columns in pyspark
拜托,我需要帮助
我是 pyspark 的新手,我遇到了这个问题
我有一个包含 4 列的数据框
A
B
C
D
O1
2
E1
2
O1
3
E1
1
O1
2
E1
0
O1
5
E2
2
O1
2
E2
3
O1
2
E2
2
O1
5
E2
1
O2
8
E1
2
O2
8
E1
0
O2
0
E1
1
O2
2
E1
4
O2
9
E1
2
O2
2
E2
1
O2
9
E2
4
O2
2
E2
2
我想要这个(每对 (A,C) 夫妇的最大 D):
A
B
C
D
O1
2
E1
2
O1
2
E2
3
O2
2
E1
4
O2
9
E2
4
我试过了
table.groupby("A","C").agg(round(max("D")))
它确实有效,因为缺少 B 列
为什么不使用 partition by 而不是 group by,这样您就可以保留所有列。您将保留所有记录。
编辑添加 - 如果您想要 A、C 的不同值 - 只需获取您想要的列并获取唯一值。
import pyspark.sql.functions as F
from pyspark.sql.window import Window
table1 = table.withColumn("max_D",F.round(F.max('D').over (Window.partitionBy('A','C'))))
table1.select('A','B','C','max_D').distinct().show()
您需要将 max
与一对 D
和 B
一起应用,这样您就不会在聚合时丢失 B
。
from pyspark.sql import functions as F
(df
.groupBy('a', 'c')
.agg(F.max(F.array('d', 'b')).alias('max_d'))
.select(
F.col('a'),
F.col('c'),
F.col('max_d')[1].alias('b'),
F.col('max_d')[0].alias('d'),
)
.show()
)
+---+---+---+---+
| a| c| b| d|
+---+---+---+---+
| O1| E1| 2| 2|
| O1| E2| 2| 3|
| O2| E1| 2| 4|
| O2| E2| 9| 4|
+---+---+---+---+
拜托,我需要帮助 我是 pyspark 的新手,我遇到了这个问题 我有一个包含 4 列的数据框
A | B | C | D |
---|---|---|---|
O1 | 2 | E1 | 2 |
O1 | 3 | E1 | 1 |
O1 | 2 | E1 | 0 |
O1 | 5 | E2 | 2 |
O1 | 2 | E2 | 3 |
O1 | 2 | E2 | 2 |
O1 | 5 | E2 | 1 |
O2 | 8 | E1 | 2 |
O2 | 8 | E1 | 0 |
O2 | 0 | E1 | 1 |
O2 | 2 | E1 | 4 |
O2 | 9 | E1 | 2 |
O2 | 2 | E2 | 1 |
O2 | 9 | E2 | 4 |
O2 | 2 | E2 | 2 |
我想要这个(每对 (A,C) 夫妇的最大 D):
A | B | C | D |
---|---|---|---|
O1 | 2 | E1 | 2 |
O1 | 2 | E2 | 3 |
O2 | 2 | E1 | 4 |
O2 | 9 | E2 | 4 |
我试过了
table.groupby("A","C").agg(round(max("D")))
它确实有效,因为缺少 B 列
为什么不使用 partition by 而不是 group by,这样您就可以保留所有列。您将保留所有记录。 编辑添加 - 如果您想要 A、C 的不同值 - 只需获取您想要的列并获取唯一值。
import pyspark.sql.functions as F
from pyspark.sql.window import Window
table1 = table.withColumn("max_D",F.round(F.max('D').over (Window.partitionBy('A','C'))))
table1.select('A','B','C','max_D').distinct().show()
您需要将 max
与一对 D
和 B
一起应用,这样您就不会在聚合时丢失 B
。
from pyspark.sql import functions as F
(df
.groupBy('a', 'c')
.agg(F.max(F.array('d', 'b')).alias('max_d'))
.select(
F.col('a'),
F.col('c'),
F.col('max_d')[1].alias('b'),
F.col('max_d')[0].alias('d'),
)
.show()
)
+---+---+---+---+
| a| c| b| d|
+---+---+---+---+
| O1| E1| 2| 2|
| O1| E2| 2| 3|
| O2| E1| 2| 4|
| O2| E2| 9| 4|
+---+---+---+---+