Spark SQL按applicantkey计算min/max日期替换原列结果异常问题
问题根因分析
- 首次GROUP BY写法问题:你将
mobilenumber加入了分组维度,相当于聚合粒度是applicantkey + utmcontent + mobilenumber,最小注册日期、最大登录日期只会在每个手机号对应的分组内计算,而非同一applicantkey下的全局值,因此手机号不同的场景结果不符合预期。 - JOIN写法问题:你用按applicantkey聚合的结果关联全量原表,当原表中同一个applicantkey下存在手机号、utmcontent都相同的重复行时,关联后会保留原表的所有重复行,因此手机号相同的场景会出现重复数据。
最优实现方案
无需拆分做JOIN,直接用窗口函数就能实现需求,既可以拿到同一applicantkey下的全局最小注册日期、最大登录日期,也不会产生JOIN带来的额外重复数据:
spark.sql( """ select applicantkey, min(first_reg_date) over(partition by applicantkey) as first_reg_date, utmcontent, max(latest_signin_date) over(partition by applicantkey) as latest_signin_date, mobilenumber from df """ ).show(truncate=False)
如果需要处理手机号相同场景的重复行,只需要在查询中先对applicantkey, utmcontent, mobilenumber三个字段去重,再做窗口函数计算即可,效率高于最终全量去重。
内容的提问来源于stack exchange,提问作者whatsinthename
相关产品推荐
相关产品推荐

