对spark的max()操作不会减少行数

时间:2017-04-11 08:49:14

标签: python apache-spark bigdata

假设我们有三列的数据集,即客户ID,操作和操作时间。

 1, ACTION_1, 100
 1, ACTION_2, 101
 1, ACTION_3, 102
 2, ACTION_1, 100
 2, ACTION_2, 105
 2, ACTION_3, 102
 3, ACTION_1, 120
 3, ACTION_2, 111
 3, ACTION_3, 103

我们希望在过滤某些特定操作(如ACTION_2)时获取每个客户的最后操作时间。如下所示:

 1, ACTION_2, 102
 2, ACTION_2, 105
 3, ACTION_2, 120

我们期待为此问题学习任何类型的解决方案。

1 个答案:

答案 0 :(得分:0)

创建数据框:

from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)

data = [
 (1, 'ACTION_1', 100),
 (1, 'ACTION_2', 101),
 (1, 'ACTION_3', 102),
 (2, 'ACTION_1', 100),
 (2, 'ACTION_2', 105),
 (2, 'ACTION_3', 102),
 (3, 'ACTION_1', 120),
 (3, 'ACTION_2', 111),
 (3, 'ACTION_3', 103)]

df = sqlContext.createDataFrame(data, ['customerid', 'action', 'actiontime'])
df.show()

在客户ID分配的窗口上使用max功能

from pyspark.sql import Window
from pyspark.sql.functions import max
w = Window.partitionBy(df.customerid)

df1 = df.withColumn('actiontime', max('actiontime').over(w))
df1.show()

根据条件过滤数据:

df2 = df1.where(df1.action == 'ACTION_2')
df2.show()
+----------+--------+----------+
|customerid|  action|actiontime|
+----------+--------+----------+
|         1|ACTION_2|       102|
|         3|ACTION_2|       120|
|         2|ACTION_2|       105|
+----------+--------+----------+