处理 PIG Latin 中的重复记录
Posted
技术标签:
【中文标题】处理 PIG Latin 中的重复记录【英文标题】:Handling duplicate records in PIG Latin 【发布时间】:2014-11-28 08:58:48 【问题描述】:如果文件中有重复,则第一条记录应转到有效文件,其余重复记录应使用 PIG 脚本移至无效文件。
下面是场景。
Input:
Acc|Phone|Name
1234|333-444-5555|XYZ
4567|222-555-1111|ABC
1234|234-123-0000|DEF
9999|123-456-1890|PQR
8734|456-879-1234|QWE
4567|369-258-0147|NNN
1234|987-654-3210|BLS
output: Two files
1. Valid rec:
1234|333-444-5555|XYZ
4567|222-555-1111|ABC
9999|123-456-1890|PQR
8734|456-879-1234|QWE
2. Invalid rec:
1234|234-123-0000|DEF
4567|369-258-0147|NNN
1234|987-654-3210|BLS
无效记录的顺序不一定相同。也可以是这样的。
Invalid rec:
1234|234-123-0000|DEF
1234|987-654-3210|BLS
4567|369-258-0147|NNN
场景 2: 输入:
1234|333-444-5555|XYZ
4567|222-555-1111|ABC
1234|234-123-0000|DEF
9999|123-456-1890|PQR
8734|456-879-1234|QWE
4567|369-258-0147|NNN
1234|087-654-3210|BLS
1234|303-444-5555|XYZ
4567|122-555-1111|ABC
1234|134-123-0000|DEF
9999|123-456-1890|PQR
8734|456-879-1234|QWE
4567|069-258-0147|NNN
1234|086-654-3210|BLS
1234|033-444-5555|XYZ
4567|200-555-1111|ABC
1234|230-123-0000|DEF
9999|023-456-1890|PQR
8734|456-779-1234|QWE
4567|309-258-0147|NNN
1234|007-654-3210|BLS
不错的推荐:
1234|333-444-5555|XYZ
4567|222-555-1111|ABC
9999|123-456-1890|PQR
8734|456-879-1234|QWE
任何人都可以提出一些想法。我只能拿到第一条记录。
谢谢。
【问题讨论】:
【参考方案1】:你可以试试这个吗?
input.txt
1234|333-444-5555|XYZ
4567|222-555-1111|ABC
1234|234-123-0000|DEF
9999|123-456-1890|PQR
8734|456-879-1234|QWE
4567|369-258-0147|NNN
1234|987-654-3210|BLS
PigScript:
A =LOAD 'input.txt' USING PigStorage('|') AS (Acc:chararray,Phone:chararray,Name:chararray);
B = RANK A;
C = GROUP B BY Acc;
D = FOREACH C
sortInAsc = ORDER B BY rank_A ASC;
top1 = LIMIT sortInAsc 1;
GENERATE top1 AS goodRecord,SUBTRACT(B,top1) AS badRecord;
--Flatten the good records
E = FOREACH D GENERATE FLATTEN(goodRecord);
--Get the required columns and skip the rank column(ie,$0)
F = FOREACH E GENERATE $1,$2,$3;
STORE F INTO 'goodrecord' USING PigStorage('|');
--Flatten the bad records
G = FOREACH D GENERATE FLATTEN(badRecord);
--Get the required columns and skip the rank column(ie,$0)
H = FOREACH G GENERATE $1,$2,$3;
STORE H INTO 'badrecord' USING PigStorage('|');
goodrecord 输出 1:
1234|333-444-5555|XYZ
4567|222-555-1111|ABC
8734|456-879-1234|QWE
9999|123-456-1890|PQR
不良记录输出 1:
1234|987-654-3210|BLS
1234|234-123-0000|DEF
4567|369-258-0147|NNN
Scenario2 goodrecord 输出:
1234|333-444-5555|XYZ
4567|222-555-1111|ABC
8734|456-879-1234|QWE
9999|123-456-1890|PQR
场景 2 错误记录输出:
1234|033-444-5555|XYZ
1234|007-654-3210|BLS
1234|230-123-0000|DEF
1234|303-444-5555|XYZ
1234|234-123-0000|DEF
1234|134-123-0000|DEF
1234|086-654-3210|BLS
1234|087-654-3210|BLS
4567|369-258-0147|NNN
4567|309-258-0147|NNN
4567|122-555-1111|ABC
4567|069-258-0147|NNN
4567|200-555-1111|ABC
8734|456-879-1234|QWE
8734|456-779-1234|QWE
9999|123-456-1890|PQR
9999|023-456-1890|PQR
【讨论】:
成功了。谢谢你。减法在我的 PIG 版本中不可用。看起来它存在于 0.12+ 版本中。我下载了 Subtract UDF 程序并添加到我的 jar 中。 如果有更多记录,则此代码不会将第一条记录返回为好记录。 Naveen,你能粘贴你的输入,让我看看吗? 嗨 Sivasakthi,我在我的问题中添加了输入。场景2。请检查。 我得到了很好的记录输出为 1234|007-654-3210|BLS 4567|069-258-0147|NNN 8734|456-779-1234|QWE 9999|023-456-1890|PQR以上是关于处理 PIG Latin 中的重复记录的主要内容,如果未能解决你的问题,请参考以下文章