Hive关联两张表时去除重复数据的查询方案咨询
解决Hive表去重问题:保留唯一(col1,col2)组合并保留col3值
嘿,我来帮你搞定这个问题!你的核心需求是基于col1和col2去重,同时保留对应的col3值(不关心具体是哪一个的话,选任意一个就行)。之前用JOIN没解决,是因为JOIN本身不会帮你去重,得先对重复的数据集做分组或窗口处理才行。
方法1:用窗口函数ROW_NUMBER()(推荐,灵活可控)
这个方法能让你精准控制保留哪一行的col3值(比如取最后出现的、最大的,或者随便一个),是处理这类去重场景的常用方案。
代码示例:
SELECT col1, col2, col3 FROM ( SELECT col1, col2, col3, -- 按col1+col2分组,给每组的行编号;ORDER BY可以控制保留哪一个col3 ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col3 DESC) AS row_num FROM Table2 ) deduplicated WHERE row_num = 1;
细节说明:
PARTITION BY col1, col2:把Table2的数据按col1和col2的组合分成不同的组,每组就是你说的重复行ORDER BY col3 DESC:在每组内按col3降序排序,这样最大的col3会排在第一位(对应你例子里1,b组的y);如果想随机取,换成ORDER BY rand()就行- 最后筛选
row_num = 1的行,就能得到每个(col1,col2)组合唯一的一行,同时保留你想要的col3值
方法2:用GROUP BY + 聚合函数(简单直接)
如果只是随便保留一个col3值,用GROUPBY加聚合函数更简单,比如MAX()、MIN()或者Hive 2.3+支持的ANY_VALUE()。
代码示例:
SELECT col1, col2, MAX(col3) AS col3 -- 换成MIN(col3)或ANY_VALUE(col3)都可以 FROM Table2 GROUP BY col1, col2;
细节说明:
GROUP BY col1, col2直接把重复的(col1,col2)组合合并成一行- 聚合函数会从每组的col3里选一个值:
MAX(col3)取最大的(对应你例子里1,b的y),ANY_VALUE()会随机选一个存在的值
如果你需要关联Table1的话
如果最终要关联Table1,记得先对Table2去重再JOIN,不然重复行还是会带过来:
SELECT t1.col1, t1.col2, t2.col3 FROM Table1 t1 JOIN ( -- 这里用上面任意一种去重逻辑 SELECT col1, col2, MAX(col3) AS col3 FROM Table2 GROUP BY col1, col2 ) t2 ON t1.col1 = t2.col1 AND t1.col2 = t2.col2;
这样就能得到和你预期完全一致的结果啦!
内容的提问来源于stack exchange,提问作者Charitra kocheri
相关产品推荐
相关产品推荐

