PySpark统计事件前90天购买量报str无over属性错误如何解决
错误原因
- 语法层面:你在调用
max聚合函数时直接传入了字符串参数'rank_test',没有将其转换为Spark的Column对象。over是SparkColumn类的专属方法,字符串类型不存在该属性,因此触发AttributeError。如果仅修复语法,把max('rank_test')修改为max(col('rank_test'))即可解决该报错。 - 逻辑层面:你的现有代码逻辑和统计「事件前90天购买总数量」的需求完全不符,即使修复语法错误也得不到预期结果,你用窗口排名取最大值的逻辑只能得到最近一次购买的标识,无法统计总条数。
正确实现方案
你不需要使用窗口排名函数,直接关联后分组统计即可,代码如下:
from pyspark.sql import functions as F result = events.join( purchase, on = [ events.User_id == purchase.User_id, purchase.Date <= events.Date, F.floor((events.Date.cast("long") - purchase.Date.cast("long")) / 86400) <= 90 ], how = "left" ).groupBy( events.Id, events.User_id, events.Date ).agg( F.count(purchase.Id).alias("qtyPurchasePast90days") )
实现说明
- 关联阶段直接过滤出符合「用户id匹配、购买日期早等于事件日期、购买日期在事件日期前90天内」的记录,减少后续计算的数据量
- 按事件表的
Id、User_id、Date分组,统计购买记录的条数就是对应90天的购买总量;left join可以保证没有符合条件购买记录的用户统计值为0,不会丢失事件行 - 最终输出和你的预期结果完全一致。
内容的提问来源于stack exchange,提问作者danimille
相关产品推荐
相关产品推荐

