在Hive数据同步中,去重常用DISTINCT关键字、GROUPBY语句或ROW_NUMBER窗口函数。DISTINCT适合快速插入去重结果;GROUPBY可同时统计重复次数;ROW_NUMBER提供灵活行筛选,但大表性能需谨慎评估。应根据数据量和集群资源选择合适方法。
DISTINCT关键字和GROUP BY语句。下面把几个主流方法拆开来讲,看看哪种更适合你的场景。
DISTINCT关键字CREATE TABLE unique_table (
column1 STRING,
column2 INT,
column3 FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
接着,用INSERT INTO配合SELECT DISTINCT把源表数据写进去,Hive会自动帮你去重:
INSERT INTO unique_table
SELECT DISTINCT column1, column2, column3
FROM source_table;
这个方法简单直接,适合源表数据量不算特别大的场景。
GROUP BY语句GROUP BY也可以轻松搞定。常见的做法是通过聚合计数来去重,就像下面这样:
CREATE TABLE unique_table AS
SELECT column1, column2, column3, COUNT(*) as count
FROM source_table
GROUP BY column1, column2, column3;
这样得到的新表里,每一行都是唯一的,同时还会附带重复次数。如果你只想要去重后的行,不需要计数,可以用ROW_NUMBER()窗口函数——给每个分组内的行编个号,然后只取编号为1的行:
CREATE TABLE unique_table AS
SELECT column1, column2, column3
FROM (
SELECT column1, column2, column3,
ROW_NUMBER() OVER (
PARTITION BY column1, column2, column3
ORDER BY (SELECT NULL)
) as row_num
FROM source_table
) subquery
WHERE row_num = 1;
这里有一点需要提醒:ROW_NUMBER()窗口函数要对全量数据集做计算,如果数据规模很大,性能上可能会吃紧。所以,数据量较小时用着没问题,大表就要谨慎评估了。
其实,去重操作的核心就是根据业务需要选择合适的方法:DISTINCT适合快速去重插入,GROUP BY搭配COUNT能同时获取重复次数,而ROW_NUMBER则提供了更灵活的行筛选能力。实践中,根据数据量和集群资源来权衡,才能让Hive跑得又稳又快。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述