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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:38:43