在pig中,我想将组减少为具有1个具有优先权的特定类型的元素



在pig中,我有A、B、C、id、id_type列。可能的id类型有"zip"、"city"、"country"、"state"one_answers"country。"

我希望使每个现有的A、B、C只存在一个实例,但优先考虑id_type为"zip"的行,但如果不是"zip",则为"city",如果不是"city,则为。。。等

所以,如果我有以下两行

(a, b, c, 555, city)
(a, b, c, 123, state)

我想去掉第二个。我可以按A、B、C分组以获得

({a, b, c}, {(a, b, c, 555, city), (a, b, c, 123, state)})

但我不知道如何从$1 中删除所有不需要的元素

@inquistive_mind:我用以下输入运行了您的代码,它不返回OP 所要求的内容

输入:

(aa,bb,cc,1,zip)
(aa,bb,cc,2,street)
(mmm,nnn,cc,3,county)
(mmm,nnn,cc,4,zip)
(mmm,nnn,cc,5,state)
(lll,ccc,ddd,6,city)
(lll,ccc,xxx,7,country)

运行代码后输出:

((aa,bb,cc),{(2,country),(1,zip)})
((lll,ccc,ddd),{(6,city)})
((lll,ccc,xxx),{(7,country)})
((mmm,nnn,cc),{(5,state),(4,zip),(3,county)})

您可以清楚地看到,它并没有在id_type的优先级上只保留一个条目。

我使用PYTHON UDF解决了这个问题。如果有更好的方法请让我知道

Python代码保存为优先级.py

def unique_list(input):
    my_list = input
    last_list = []
    #print(my_list[0][4])
    #print(len(my_list))
    for i in range(len(my_list)):
        last_list.append(my_list[i][4])

        print(last_list)
        for j in range(len(last_list)):
          if(last_list[j]) == "zip":
             return_list = list(my_list[j])
             break
          elif (last_list[j] == 'city'):
              return_list = list(my_list[j])
              break
          elif (last_list[j] == 'county'):
              return_list = list(my_list[j])
              break
          elif (last_list[j] == 'state'):
              return_list = list(my_list[j])
              break
          elif (last_list[j] == 'country'):
              return_list = list(my_list[j])
              break
 return return_list

现在猪代码

REGISTER 'priority.py' using jython as callme
A = LOAD 'addr.dat' USING PigStorage(',') AS (A : chararray, B :chararray , C:  chararray , ID :  chararray,  ID_TYPE :  chararray);
B = DISTINCT A;
Z=  GROUP B BY (A,B,C);
O = FOREACH Z GENERATE callme.unique_list($1) as record :{(A : chararray, B :chararray , C:  chararray , ID :  chararray,  ID_TYPE :  chararray)} ;
DUMP O;

请根据您的输入运行此操作,并检查它是否工作

一种方法是编写UDF,另一种方法为:

 ABC = load 'testdata.csv' using PigStorage(',') as (a: chararray, b: chararray, c: chararray, id: int, id_type: chararray);
MappedABC = foreach ABC generate a, b, c, id, id_type, (id_type == 'zip' ? 1 : (id_type == 'city' ?  2 : (id_type == 'county' ?  3 : (id_type == 'state' ?  4 : 5)))) as idorder;
FinalABC = foreach (group MappedABC by (a,b,c)) {
    OrderedABC = order MappedABC by idorder;
    LimitedABC = limit OrderedABC 1;
    generate
        flatten(LimitedABC)
    ;
};
store FinalABC into 'out' using PigStorage(';');

最新更新