PySpark SQL按规则计算用户偏好风格 处理分组最高值重复问题
用户偏好风格计算需求
输入数据集
| person | style | n |
|---|---|---|
| P1 | A | 1 |
| P2 | A | 1 |
| P2 | B | 2 |
| P3 | A | 1 |
| P3 | B | 2 |
| P3 | C | 2 |
| P4 | A | 2 |
| P4 | B | 2 |
计算规则
- 规则1:若某用户仅拥有1种风格(如P1),无论其观测值
n为多少,该风格即为该用户的偏好。 - 规则2:若某用户拥有2种及以上风格,且存在唯一的最大n值(如P2的风格B),则该风格即为该用户的偏好。
- 规则3:若某用户拥有3种及以上风格,且最高
n值对应至少2种相同的取值(即最高n值出现重复,如P3的风格B、C),则所有具备最高n值的风格均为该用户的偏好。 - 规则4:若某用户拥有2种及以上风格,且所有风格的
n值完全相同(如P4;注:若P3的风格A的n值提升至2,则也属于该类场景),则不为该用户设置任何偏好。
现有实现问题
- 作为Spark开发新手,传统处理方案为先按
person执行GROUP、ORDER操作,再迭代遍历结果集判断max(n)后处理规则,但已知Spark开发应避免迭代、collect等操作。 - 现有的分组取列最大值的实现无法满足规则3、4的要求。
- 初步猜想可通过自连接实现,判断逻辑类似
(count(max(n)) <> count(*)) or count(max(n)) = 1,但自身并非SQL专家。 - 可参考MongoDB的实现思路:将每位用户的风格与
n值聚合为数组,通过$reduce遍历数组判断n值是否全部相同,为对应文档添加状态标记,但需要适配为Spark的实现方案。
目标输出数据集
| person | style | n |
|---|---|---|
| P1 | A | 1 |
| P2 | B | 2 |
| P3 | B | 2 |
| P3 | C | 2 |
内容的提问来源于stack exchange,提问作者Buzz Moschetti
相关产品推荐
相关产品推荐

