1field 2023-06-30 10:57 采纳率: 0%
浏览 20

hive,sql,重复主键不重复值,大小表关联怎么处理

有表A和B,A表100万条数据,B表1万条。想根据表A和B生成一个新表C,新表C中有表A所有数据和表B中segment字段数据。关联关系是rid和resid。
如果满足三范式,直接a left join b就好了
现在问题是表A中有重复主键rid,重复主键每一条数据都不一样(hive表牺牲空间换时间),不能直接distinct

A表如下

img

B表如下

img

我现在想的是用A.distinct rid join B 得到一个唯一id关系表

img

然后用表A join这个唯一id表 就可以关联到所有sgment字段

也不知道对不对,因为还没有资源跑sql,想问问老哥们有没有更好的方法

  • 写回答

2条回答 默认 最新

  • 自在猫先生 2023-06-30 11:40
    关注

    源于chatGPT仅供参考

    如果表A中有重复的主键rid,并且每条数据都不相同,那么在进行关联操作时,不能直接使用DISTINCT来去除重复的数据。在这种情况下,可以考虑以下两种方法:
    
    **1. 使用子查询或聚合函数:**
    您可以使用子查询或聚合函数来处理表A中的重复数据,以便进行关联操作。例如,您可以使用GROUP BY语句将表A中的重复主键聚合,并根据需要选择其中的某一条记录。然后,再将这个结果与表B进行关联。
    
    示例SQL语句:
    ```sql
    SELECT A.rid, MAX(A.column1), MAX(A.column2), ..., B.segment
    FROM tableA A
    JOIN tableB B ON A.rid = B.resid
    GROUP BY A.rid, B.segment
    

    上述示例中,使用MAX函数仅作为示例,您可以根据实际需求选择适合的聚合函数或子查询方式。

    2. 使用窗口函数:
    另一个处理重复数据的方法是使用窗口函数(Window Function)。窗口函数可以在计算过程中对分组内的数据进行排序和筛选,并从中选择特定的行。

    示例SQL语句:

    SELECT rid, column1, column2, ..., segment
    FROM (
        SELECT A.rid, A.column1, A.column2, ..., B.segment,
               ROW_NUMBER() OVER (PARTITION BY A.rid ORDER BY A.column1) AS row_num
        FROM tableA A
        JOIN tableB B ON A.rid = B.resid
    ) AS temp
    WHERE row_num = 1
    

    上述示例中,使用ROW_NUMBER函数和PARTITION BY子句将表A中的重复主键分组,并根据需要选择其中的第一条记录。

    请注意,以上方法仅为处理表A中重复主键的示例,您可以根据实际情况和需求进行调整。同时,如果表A中的数据量非常大(如100万条),在执行关联操作时可能会对性能产生一定影响,因此请根据具体情况进行评估和优化。

    ```

    评论

报告相同问题?

问题事件

  • 创建了问题 6月30日

悬赏问题

  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口