使用 PigLatin 删除重复项并保留最后一个元素
Removing duplicates using PigLatin and retaining the last element
我正在使用 PigLatin。我想从包中删除重复项并希望保留特定键的最后一个元素。
Input:
User1 7 LA
User1 8 NYC
User1 9 NYC
User2 3 NYC
User2 4 DC
Output:
User1 9 NYC
User2 4 DC
这里第一个字段是一个key。我希望在输出中保留该特定键的最后一条记录。
我知道如何保留第一个元素。如下所示。但无法保留最后一个元素。
inpt = load '......' ......;
user_grp = GROUP inpt BY [=11=];
filtered = FOREACH user_grp {
top_rec = LIMIT inpt 1;
GENERATE FLATTEN(top_rec);
};
有人可以帮我解决这个问题吗?提前致谢!
好的..您可以使用 RANK 运算符。
希望以下代码对您有所帮助。
rec = LOAD '/user/cloudera/inputfiles/sample.txt' USING PigStorage(',') AS(user:chararray,no:int,loc:chararray);
rec_rank = rank rec;
rec_rank_each = FOREACH rec_rank GENERATE [=10=] as rank_key, user, no, loc;
rec_rank_grp = GROUP rec_rank_each by user;
rec_rank_max = FOREACH rec_rank_grp GENERATE group as temp_user, MAX(rec_rank_each.rank_key) as max_rank;
rec_join = JOIN rec_rank_each BY (user,rank_key) , rec_rank_min BY(temp_user,max_rank);
rec_output = FOREACH rec_join GENERATE user,no,loc;
dump rec_output;
确保你运行这个来自 pig 0.11 版本的排名运算符是从 pig 0.11
引入的
@Anil:如果您按降序排列其中一个字段。您将能够获得最后一条记录。在下面的代码中,已按输入的第二个字段排序(字段名称:脚本中没有)
输入:
User1,7,LA
User1,8,NYC
User1,9,NYC
User2,3,NYC
User2,4,DC
猪片段:
user_details = LOAD 'user_details.csv' USING PigStorage(',') AS (user_name:chararray,no:long,city:chararray);
user_details_grp_user = GROUP user_details BY user_name;
required_user_details = FOREACH user_details_grp_user {
user_details_sorted_by_no = ORDER user_details BY no DESC;
top_record = LIMIT user_details_sorted_by_no 1;
GENERATE FLATTEN(top_record);
}
输出:转储required_user_details
(User1,9,NYC )
(User2,4,DC)
我正在使用 PigLatin。我想从包中删除重复项并希望保留特定键的最后一个元素。
Input:
User1 7 LA
User1 8 NYC
User1 9 NYC
User2 3 NYC
User2 4 DC
Output:
User1 9 NYC
User2 4 DC
这里第一个字段是一个key。我希望在输出中保留该特定键的最后一条记录。
我知道如何保留第一个元素。如下所示。但无法保留最后一个元素。
inpt = load '......' ......;
user_grp = GROUP inpt BY [=11=];
filtered = FOREACH user_grp {
top_rec = LIMIT inpt 1;
GENERATE FLATTEN(top_rec);
};
有人可以帮我解决这个问题吗?提前致谢!
好的..您可以使用 RANK 运算符。
希望以下代码对您有所帮助。
rec = LOAD '/user/cloudera/inputfiles/sample.txt' USING PigStorage(',') AS(user:chararray,no:int,loc:chararray);
rec_rank = rank rec;
rec_rank_each = FOREACH rec_rank GENERATE [=10=] as rank_key, user, no, loc;
rec_rank_grp = GROUP rec_rank_each by user;
rec_rank_max = FOREACH rec_rank_grp GENERATE group as temp_user, MAX(rec_rank_each.rank_key) as max_rank;
rec_join = JOIN rec_rank_each BY (user,rank_key) , rec_rank_min BY(temp_user,max_rank);
rec_output = FOREACH rec_join GENERATE user,no,loc;
dump rec_output;
确保你运行这个来自 pig 0.11 版本的排名运算符是从 pig 0.11
引入的@Anil:如果您按降序排列其中一个字段。您将能够获得最后一条记录。在下面的代码中,已按输入的第二个字段排序(字段名称:脚本中没有)
输入:
User1,7,LA
User1,8,NYC
User1,9,NYC
User2,3,NYC
User2,4,DC
猪片段:
user_details = LOAD 'user_details.csv' USING PigStorage(',') AS (user_name:chararray,no:long,city:chararray);
user_details_grp_user = GROUP user_details BY user_name;
required_user_details = FOREACH user_details_grp_user {
user_details_sorted_by_no = ORDER user_details BY no DESC;
top_record = LIMIT user_details_sorted_by_no 1;
GENERATE FLATTEN(top_record);
}
输出:转储required_user_details
(User1,9,NYC )
(User2,4,DC)