如何用PySpark或SparkSQL合并不同粒度表且不生成重复数据?
解决方案
首先明确核心问题:两张表的粒度均为Product#,但Table 1包含ID字段(同一Product#可能对应多条ID记录),Table 2中每个Product#对应唯一Target。左连接后出现重复,本质是Table 2可能存在同一Product#的重复记录,或Table 1同一Product#的多条记录带出相同Target(后者属于正常关联,但如果是Table 2的重复导致Table 1行重复,则需要先处理Table 2)。
方法1:先对Table 2去重,再左连接
由于每个Product#仅对应一个Target,先确保Table 2中Product#唯一,再与Table 1关联:
SELECT t1.Year, t1.customer, t1.ID, t1.Business#, t1.Product#, t1.Revenue, t2.Target FROM Table1 t1 LEFT JOIN ( -- 去重,确保每个Product#仅保留一条Target记录 SELECT DISTINCT Product#, Target FROM Table2 ) t2 ON t1.Product# = t2.Product#
如果Table 2中同一Product#存在多条Target记录(业务上理论值应一致),可以用GROUP BY聚合取唯一值:
SELECT t1.*, t2.Target FROM Table1 t1 LEFT JOIN ( SELECT Product#, MAX(Target) AS Target -- 用MAX/MIN都可,因为同一Product#的Target应相同 FROM Table2 GROUP BY Product# ) t2 ON t1.Product# = t2.Product#
方法2:用窗口函数标记唯一行(复杂场景适用)
如果需要保留Table 2其他字段同时确保Product#唯一,可使用窗口函数ROW_NUMBER()筛选唯一行:
SELECT t1.*, t2.Target FROM Table1 t1 LEFT JOIN ( SELECT *, ROW_NUMBER() OVER(PARTITION BY Product# ORDER BY (SELECT NULL)) AS rn FROM Table2 ) t2 ON t1.Product# = t2.Product# AND t2.rn = 1
为什么你的之前方法无效?
你尝试用SUM(Target)/COUNT(ID_Count)计算Target_final是错误逻辑:Target是按Product#设置的固定值,不是需要按ID分摊的数值,直接关联取对应Product#的Target即可,无需做除法运算。
内容的提问来源于stack exchange,提问作者user21357404
相关产品推荐
相关产品推荐

