【问题标题】:Handling duplicate records in PIG Latin处理 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

任何人都可以提出一些想法。我只能拿到第一条记录。

谢谢。

【问题讨论】:

    标签: hadoop apache-pig


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多