PySpark - 选择每周 3 天、每月 3 周查看的用户



我知道这是一个非常具体的问题,在stackoverflow上发布这种问题并不常见,但我处于一种奇怪的情况,即有一个可以解决我问题的朴素算法的想法,但无法实现它。因此,我的问题。

我有一个数据框

|user_id| action | day | week |
------------------------------
| d25as | AB     | 2   | 1    |
| d25as | AB     | 3   | 2    |
| d25as | AB     | 5   | 1    | 
| m3562 | AB     | 1   | 3    |
| m3562 | AB     | 7   | 1    |
| m3562 | AB     | 9   | 1    |
| ha42a | AB     | 3   | 2    |
| ha42a | AB     | 4   | 3    |
| ha42a | AB     | 5   | 1    |

我想创建一个数据帧,其用户看起来每周至少 3 天,每月至少 3 周"天"列从 1 到 31,"周"列从 1 到 4。

我想这样做的方式是:

split dataframe into 4 dataframes for each week
for every week_dataframe count days seen per user. 
count for every user how many weeks with >= 3 days they were seen.
only add to the new df the users seen for >= 3 such weeks. 

现在我需要在 Spark 中以一种可扩展的方式执行此操作,我不知道如何实现它。另外,如果您对算法有比我天真的方法更好的想法,那将非常有帮助。

我建议使用 groupBy 函数来选择用户,其中选择器:

df.groupBy('user_id', 'week')
.agg(countDistinct('day').alias('days_per_week'))
.where('days_per_week >= 3')
.groupBy('user_id')
.agg(count('week').alias('weeks_per_user'))
.where('weeks_per_user >= 3' )

@eakotelnikov是正确的。

但是,如果有人面临错误

名称

错误:未定义名称"计数不同"

那么请在执行 eakotelnikov 解决方案之前使用以下语句

from pyspark.sql.functions import *

为此问题添加另一个解决方案

tdf.registerTempTable("tbl")
outdf = spark.sql(""" 
select user_id , count(*) as weeks_per_user from
( select user_id , week , count(*) as days_per_week 
  from tbl 
  group by user_id , week  
  having count(*) >= 3
 ) x
group by user_id
having count(*) >= 3
""")
outdf.show()

最新更新