2017-11-26 16 views
0

해결할 수 없었던 Pig의 UNION에 문제가 있습니다. 동일한 스크립트에서 일부 관계에 대해 UNION을 수행하면 잘 작동하지만 다른 관계에서는 작동하지 않습니다. 나는 두 가지 관계, 즉 onetwo에서 UNION을 수행하고 있습니다. 그리고 그것은이 두 관계와 많은 다른 관계들에서 작동하지 않을 것입니다. 내 스크립트는 다음과 같습니다.Apache Pig의 특정 관계에서만 UNION 연산을 수행 할 수 없습니다.

A = LOAD '/home/biadmin/datasets/Datasets/HomeA/2014/homeA2.csv' USING PigStorage(',') AS (Date:chararray ,use:float, gen:float, FurnaceHRV:float, CellarOutlets:float, WashingMachine:float, FridgeRange:float, DisposalDishwasher:float, KitchenLights:float, BedroomOutlets:float, BedroomLights:float, MasterOutlets:float, MasterLights:float, DuctHeaterHRV:float); 
C = FOREACH A GENERATE Date,SUM(TOBAG(use..)) AS total:float, '1388552400' AS unixconst1:chararray, '86400' AS dayconst1:chararray;           
hourly = FILTER C BY ENDSWITH(Date, '00'); 
hourlymd = FOREACH hourly GENERATE *, SUBSTRING(Date,0,INDEXOF(Date,'/',0)) as month1:chararray, SUBSTRING(Date,INDEXOF(Date,'/',0)+1,LAST_INDEX_OF(Date,'/')) as day1:chararray, SUBSTRING(Date,LAST_INDEX_OF(Date,'/')+1,INDEXOF(Date,' ',0)) as year1:chararray, SUBSTRING(Date,INDEXOF(Date,' ',0)+1,INDEXOF(Date,':',0)) as hour1:chararray;                
hourlymdB = FOREACH hourlymd GENERATE (int)(hour1) AS hour:int, (int)(day1) AS day:int, (int)(month1) AS month:int, (int)(year1) AS year:int, (int)(unixconst1) AS unixconst:int, (int)(dayconst1) AS dayconst:int; 
SPLIT hourlymdB INTO 
     one IF(month==1), 
     two IF(month==2), 
     three IF(month==3), 
     four IF(month==4), 
     five IF(month==5), 
     six IF(month==6), 
     seven IF(month==7), 
     eight IF(month==8), 
     nine IF(month==9), 
     ten IF(month==10), 
     eleven IF(month==11), 
     twelve IF(month==12), 
     rest OTHERWISE; 

yearone = UNION one, two; 

STORE yearone INTO '/home/biadmin/datasets/output/yearone'; 

이 코드는 작동하지 않으며 오류가 없습니다. 다음은 출력을 실행할 때의 결과입니다. AC에 UNION을 수행하고, 작성하는 경우

Pig Stack Trace 
--------------- 
ERROR 0: java.lang.NullPointerException 

org.apache.pig.backend.executionengine.ExecException: ERROR 0: java.lang.NullPointerException 
    at org.apache.pig.backend.hadoop.executionengine.HExecutionEngine.launchPig(HExecutionEngine.java:283) 
    at org.apache.pig.PigServer.launchPlan(PigServer.java:1367) 
    at org.apache.pig.PigServer.executeCompiledLogicalPlan(PigServer.java:1352) 
    at org.apache.pig.PigServer.execute(PigServer.java:1341) 
    at org.apache.pig.PigServer.executeBatch(PigServer.java:392) 
    at org.apache.pig.PigServer.executeBatch(PigServer.java:375) 
    at org.apache.pig.tools.grunt.GruntParser.executeBatch(GruntParser.java:170) 
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:232) 
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:203) 
    at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:81) 
    at org.apache.pig.Main.run(Main.java:608) 
    at org.apache.pig.Main.main(Main.java:156) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:94) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
    at java.lang.reflect.Method.invoke(Method.java:619) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212) 
Caused by: java.lang.NullPointerException 
    at org.apache.hadoop.mapreduce.Job$4.run(Job.java:963) 
    at org.apache.hadoop.mapreduce.Job$4.run(Job.java:961) 
    at java.security.AccessController.doPrivileged(AccessController.java:366) 
    at javax.security.auth.Subject.doAs(Subject.java:572) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1502) 
    at org.apache.hadoop.mapreduce.Job.getTaskReports(Job.java:961) 
    at org.apache.pig.backend.hadoop.executionengine.shims.HadoopShims.getTaskReports(HadoopShims.java:218) 
    at org.apache.pig.tools.pigstats.mapreduce.MRJobStats.addMapReduceStatistics(MRJobStats.java:353) 
    at org.apache.pig.tools.pigstats.mapreduce.MRPigStatsUtil.addSuccessJobStats(MRPigStatsUtil.java:233) 
    at org.apache.pig.tools.pigstats.mapreduce.MRPigStatsUtil.accumulateStats(MRPigStatsUtil.java:165) 
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher.launchPig(MapReduceLauncher.java:364) 
    at org.apache.pig.backend.hadoop.executionengine.HExecutionEngine.launchPig(HExecutionEngine.java:277) 
    ... 16 more 
================================================================================ 

그러나 :

yearone = UNION A, C; 

를 그 다음은 문제없이 잘 작동하고 대상의 관계를 저장합니다. 나는 이유를 알 수 없다? 나는 명령을 사용하여 grunt> (로컬 모드) 셸과 외부 모두에서 실행했습니다.

도움을 주시면 대단히 감사하겠습니다.

답변

1

UNION A, Cyearone = onev UNION twov의 구문을 살펴보십시오. 두 번째 UNION 구문은

yearone = UNION onev, twov; 

참고 incorrect.Change 그 것이다 : 나는 당신의 대본이있는 onev 및 TWOV 관계는 당신이 당신의 스크립트에 사람들이 가정입니다 표시되지 않습니다.

+0

당신 말이 맞습니다. 잘못된 구문입니다. 'UNION one, two;'로 변경했습니다. 다시 말하지만, UNION을 할 수있는 유일한 관계는 'A', 'C', 'hourly'뿐입니다. –

+0

다른 관계에 레코드가 있는지 확인하십시오. –