如何在Apache Pig中删除重复的数据行?
在Apache Pig中删除重复数据行的方法
针对你给出的重复数据示例(同一视频标题对应多组播放、点赞等统计数据),我分两种常见场景讲解去重方案:
1. 全字段完全重复的去重(整行内容完全一致)
如果你的数据中存在完全相同的整行,直接使用DISTINCT操作即可快速去重:
步骤示例:
-- 加载数据(假设你的数据用制表符分隔,可根据实际分隔符调整) videos = LOAD 'your_input_path' USING PigStorage('\t') AS (title:chararray, views:long, likes:long, dislikes:long, comments:long); -- 全字段去重 unique_full_rows = DISTINCT videos; -- 存储去重后的结果 STORE unique_full_rows INTO 'your_output_path';
DISTINCT会自动移除所有整行内容完全重复的记录,只保留唯一的行。
2. 按特定字段去重(如示例中同一标题对应多行数据)
你的示例数据是同一视频标题对应不同的统计数值,这种场景需要按title字段分组,再保留每组内的指定行(比如最新数据、播放量最高的数据,或任意一行)。
方案A:保留每组中播放量最高的行
如果想保留每个视频标题下播放量最高的那条记录,可以这样写:
-- 加载数据 videos = LOAD 'your_input_path' USING PigStorage('\t') AS (title:chararray, views:long, likes:long, dislikes:long, comments:long); -- 按标题分组 grouped_videos = GROUP videos BY title; -- 对每组内的行按播放量降序排序,取第一行(播放量最高的) unique_videos = FOREACH grouped_videos { sorted_videos = ORDER videos BY views DESC; top_view_row = LIMIT sorted_videos 1; GENERATE FLATTEN(top_view_row); }; -- 存储结果 STORE unique_videos INTO 'your_output_path';
方案B:保留每组中的任意一行
如果不需要筛选特定逻辑,只想每个标题保留任意一行记录,可以简化操作:
-- 加载数据 videos = LOAD 'your_input_path' USING PigStorage('\t') AS (title:chararray, views:long, likes:long, dislikes:long, comments:long); -- 按标题分组后取每组第一行 grouped_videos = GROUP videos BY title; unique_videos = FOREACH grouped_videos GENERATE FLATTEN(LIMIT videos, 1); -- 存储结果 STORE unique_videos INTO 'your_output_path';
说明
GROUP BY title会将所有相同标题的行归为一个组;FLATTEN用于将分组后的嵌套结构展开成原始的行格式;- 可以根据需求调整排序字段(比如
likes、comments)或排序方向(ASC升序)。
内容的提问来源于stack exchange,提问作者Chintan Davda
相关产品推荐
相关产品推荐

