假设我们有三列的数据集,即客户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
我们期待为此问题学习任何类型的解决方案。
答案 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|
+----------+--------+----------+