You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:39:55