복붙노트

[HADOOP] 돼지 튜플을 Python UDF에 전달할 수 없습니다.

HADOOP

돼지 튜플을 Python UDF에 전달할 수 없습니다.

master.txt에는 10K 레코드가 있으므로 각 줄은 튜플 및 파이썬 UDF로 전달되어야하는 동일한 전체가 될 것입니다. 여러 레코드가 있으므로 p2preportmap을 저장하는 중 오류가 발생합니다. 도와주세요

오류는 다음과 같습니다.

돼지 스크립트는 다음과 같습니다 :

REGISTER 'smsiuc_udf.py' using streaming_python as smsiuc_udfs;
cdrs = load '2016040111*' USING PigStorage('|','-tagFile') ;

mastergtrec = load 'master.txt' USING PigStorage(',','-tagFile');

mastergt = FOREACH mastergtrec GENERATE (chararray) UPPER($1) as opcdpc, (chararray) UPPER($2) as gtoptname,(chararray) UPPER($3) as gtoptcircle;

mastergttup = FOREACH mastergt generate TOTUPLE(opcdpc,gtoptname,gtoptcircle) as mstgttup;

cdrrecord = FOREACH cdrs GENERATE (chararray) UPPER($1) as aparty, (chararray) UPPER($2) as bparty,$3 as smssentdate,$4 as smssenttime,($29=='6' ? 'S' : 'F') as status,(chararray) UPPER($26) as srcgt,(chararray) UPPER($27) as destgt,($12=='405899136999995' ? 'MTSDEL-CDMA' : ($12=='919875089998' ? 'MTSRAJ-GSM' : ($12=='405899150999995' ? 'MTSCHN-CDMA' : $12) ) ) as smscgt, (chararray)$0 as cdrfname,(chararray) $13 as prepost;

filteredp2pcdrs = FILTER cdrrecord by smsiuc_udfs.pullp2pcdrs(aparty,bparty,srcgt,destgt) and status == 'S' and SUBSTRING(smssentdate,4,6) == '$MON';

groupp2pcdrs = GROUP filteredp2pcdrs by (srcgt,destgt,aparty,bparty,smscgt,status,prepost);

distinctp2pcdrs= FOREACH groupp2pcdrs {
uniq = DISTINCT filteredp2pcdrs.(srcgt,destgt,aparty,bparty,smscgt,status,prepost);
GENERATE FLATTEN(group),COUNT(uniq) as cnt;
};

p2preportmap = FOREACH distinctp2pcdrs GENERATE smsiuc_udfs.p2preport(srcgt,destgt,aparty,bparty,mastergttup ),smscgt,status,prepost,cnt

해결법

  1. ==============================

    1.더미 열을 추가 한 다음 그룹화하면됩니다.

    더미 열을 추가 한 다음 그룹화하면됩니다.

    dummy = foreach p2p portmap은 1, $ 0, $ 1을 생성합니다.

    grouped = $ 0에 의해 더미 그룹

  2. ==============================

    2.내가 A와 B의 두 가지 관계가 있다는 예를 들어 보겠다.

    내가 A와 B의 두 가지 관계가 있다는 예를 들어 보겠다.

    에이

    1,2,3
    3,4,5
    4,5,6
    

    1
    2
    3
    1
    2
    3
    1
    2
    3
    

    이제 파이썬 udf 원하는 인쇄 출력의 첫 번째 열을 아래에 이와 같은 것입니다.

        ((1,{(1,2,3)}))
    ((2,))
    ((3,{(3,4,5)}))
    ((1,{(1,2,3)}))
    ((2,))
    ((3,{(3,4,5)}))
    ((1,{(1,2,3)}))
    ((2,))
    ((3,{(3,4,5)}))
    

    먼저 첫 번째 열에 A를 그룹화 한 다음 1을 그룹화하여 단일 행을 갖도록합니다.

    c = group A by $0
    e = group c by 1
    

    파이썬 udf는 아래와 같습니다.

    def pythonudf(value,map):
        print map
        temp = None
        for a in map:
            if a[0] == value:
                temp = a[1]
        return value,temp
    

    이제이 udf를 사용합니다.

    D = foreach B generate myudf.pythonudf($0,e.$1);
    
  3. from https://stackoverflow.com/questions/37119870/unable-to-pass-pig-tuple-to-python-udf by cc-by-sa and MIT license