2017-02-02 10 views
0

Я пытаюсь какНЕ В статье в PIG

select * from A where A.ID NOT IN (select id from B) (in sql) 

sourcenew = LOAD 'hdfs://HADOOPMASTER:54310/DVTTest/Source.txt' USING PigStorage(',') as (ID:int,Name:chararray,FirstName:chararray ,LastName:chararray,Vertical_Name:chararray ,Vertical_ID:chararray,Gender:chararray,DOB:chararray,Degree_Percentage:chararray ,Salary:chararray,StateName:chararray); 
destnew = LOAD 'hdfs://HADOOPMASTER:54310/DVTTest/Destination.txt' USING PigStorage(',') as (ID:int,Name:chararray,FirstName:chararray ,LastName:chararray,Vertical_Name:chararray ,Vertical_ID:chararray,Gender:chararray,DOB:chararray,Degree_Percentage:chararray ,Salary:chararray,StateName:chararray); 
c= FOREACH destnew GENERATE ID; 
D=FILTER sourcenew BY NOT ID (c.ID); 
org.apache.pig.tools.pigscript.parser.ParseException: Encountered " <PATH> "D=FILTER "" at line 1, column 1. 
Was expecting one of: 
<EOF> 
"cat" ... 
"clear" ...<EOF> 

любая помощь в этом, чтобы устранить ошибку, получить это на исполнение последней строки.

+0

Подумайте о том, группируя 2 отношения по идентификатору и не отфильтровывая их, не имеющего матч – 54l3d

ответ

1

Используйте LEFT OUTER JOIN и фильтрации NULLS

sourcenew = LOAD 'hdfs://HADOOPMASTER:54310/DVTTest/Source.txt' USING PigStorage(',') as (ID:int,Name:chararray,FirstName:chararray ,LastName:chararray,Vertical_Name:chararray ,Vertical_ID:chararray,Gender:chararray,DOB:chararray,Degree_Percentage:chararray ,Salary:chararray,StateName:chararray); 
destnew = LOAD 'hdfs://HADOOPMASTER:54310/DVTTest/Destination.txt' USING PigStorage(',') as (ID:int,Name:chararray,FirstName:chararray ,LastName:chararray,Vertical_Name:chararray ,Vertical_ID:chararray,Gender:chararray,DOB:chararray,Degree_Percentage:chararray ,Salary:chararray,StateName:chararray); 
c = FOREACH destnew GENERATE ID; 
d = JOIN sourcenew BY ID LEFT OUTER,destnew by ID; 
e = FILTER d by destnew.ID is null; 

ПРИМЕЧАНИЕ Я написал пример сценария с парой тестовых файлов и ниже рабочего solution.In вам случай проверьте, чтобы увидеть, если вы загружаете данные правильно из ваших файлов.

test1.txt

1 abc 
2 def 
3 ghi 
4 jkl 
5 mno 
6 pqr 
7 stu 
8 vwx 
1 abc 
2 def 
3 ghi 
4 jkl 
1 abc 
2 def 
3 ghi 
1 abc 
2 def 

test2.txt

1 
2 
3 
4 

Script

A = LOAD 'test1.txt' USING PigStorage('\t') AS (aid:int,name:chararray); 
B = LOAD 'test2.txt' USING PigStorage('\t') AS (bid:int); 
C = JOIN A BY aid LEFT OUTER,B BY bid; 
D = FILTER C BY bid is null; 
DUMP D; 

Таким образом, в приведенном выше примере RECO rds 5,6,7,8 должны быть в результате, поскольку эти идентификаторы не находятся в test2.txt.

Output

+0

ERROR org.apache.pig.tools.grunt.Grunt - ОШИБКА 1066: Невозможно открыть итератор для псевдонима д. Ошибка backend: org.apache.pig.backend.executionengine.ExecException: ERROR 0: Scalar имеет более одной строки в выходе. 1st: (1), 2nd: (2) (общая причина: «JOIN», а затем «FOREACH ... GENERATE foo.bar» должен быть «foo :: bar») @inquisitive_mind – Vickyster

+0

И я даже попробовал d = FILTER sourcenew BY NOT (sourcenew.ID == c.ID); – Vickyster

+0

@ Vickyster, я отредактировал ответ, а также включил пример. Упование, которое помогает. –

 Смежные вопросы

  • Нет связанных вопросов^_^