[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.더미 열을 추가 한 다음 그룹화하면됩니다.
더미 열을 추가 한 다음 그룹화하면됩니다.
dummy = foreach p2p portmap은 1, $ 0, $ 1을 생성합니다.
grouped = $ 0에 의해 더미 그룹
-
==============================
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);
from https://stackoverflow.com/questions/37119870/unable-to-pass-pig-tuple-to-python-udf by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] HTable (config, tablename) 유형은 더 이상 사용되지 않습니다. 대신 무엇을 사용합니까? (0) | 2019.06.22 |
---|---|
[HADOOP] 필수 입력란 'client_protocol'이 설정되지 않았습니다. (0) | 2019.06.22 |
[HADOOP] Hadoop에서 pdf 파일의 데이터에 액세스하고 조작하는 방법은 무엇입니까? (0) | 2019.06.22 |
[HADOOP] 하이브의 시퀀스 파일 형식 및 마루판 파일 형식은 무엇입니까? (0) | 2019.06.22 |
[HADOOP] java.lang.OutOfMemoryError : 100 바이트의 메모리를 확보 할 수 없습니다. 0을가집니다. (0) | 2019.06.22 |