我是Spark的新手。我正在如下使用数据框df
DeviceID TimeStamp A B C
00234 11-03-2014 05:55 5.6 2.3 3.3
00235 11-03-2014 05:33 2.8 0.9 4.2
00236 11-03-2014 06:15 3.5 0.1 1.3
00234 11-03-2014 07:23 2.5 0.2 3.9
00236 11-03-2014 07:33 2.5 4.5 2.9
从上面的示例df
中可以看出,对于DeviceID
00234,A
,B
和C
中的最大值是5.6。同样,对于DeviceID
00236,A
,B
和C
中的最大值为4.5。
我想根据每个TimeStamp
的最大值检索DeviceID
值。显然,DeviceID
00234是11-03-2014 05:55
。
尽管我还没有尝试过任何方法,但是以下方法会起作用吗?
from pyspark.sql import function as F
max_value = df.groupby('DeviceID').agg(F.greatest('A','B','C').alias('max_value'))
df.withColumn('Max-TimeStamp',where(# please help me in putting the right codes))
生成的df
应该如下所示
DeviceID Max_Value Max-TimeStamp
00234 5.6 11-03-2014 05:55
00236 4.5 11-03-2014 07:33
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
您可以使用Window函数来实现此目的:
import pyspark.sql.functions as F
from pyspark.sql import Window
l = [('00234' , '11-03-2014 05:55', 5.6 , 2.3 , 3.3),
('00235' , '11-03-2014 05:33' , 2.8, 0.9 , 4.2),
('00236' , '11-03-2014 06:15' , 3.5 , 0.1 , 1.3),
('00234' , '11-03-2014 07:23' , 2.5 , 0.2 , 3.9),
('00236' , '11-03-2014 07:33', 2.5 , 4.5, 2.9)]
columns = ['DeviceID', 'TimeStamp', 'A','B','C']
df=spark.createDataFrame(l, columns)
w = Window.partitionBy('DeviceID')
df = df.select('DeviceID', 'TimeStamp', F.greatest('A','B','C').alias('max_value'))
df.withColumn('bla', F.max('max_value').over(w)).where(F.col('max_value') == F.col('bla')).drop('bla').show()
输出:
+--------+----------------+---------+
|DeviceID| TimeStamp |max_value|
+--------+----------------+---------+
| 00236|11-03-2014 07:33| 4.5|
| 00234|11-03-2014 05:55| 5.6|
| 00235|11-03-2014 05:33| 4.2|
+--------+----------------+---------+