2016-08-30 2 views
2

Ich habe zwei Dateien in hdfs Daten enthalten, wie folgt, File1:Kombination von Union und Mitglied in Apache Schwein

id,name,age 
1,x1,15 
2,x2,14 
3,x3,16 

File2:

id,name,grades 
1,x1,A 
2,x2,B 
4,y1,A 
5,y2,C 

ich die folgende Ausgabe produzieren wollen:

id,name,age,grades 
1,x1,15,A 
2,x2,14,B 
3,x3,16, 
4,y1,,A 
5,y2,,C 

Ich benutze Apache Schwein, um die Operation durchzuführen, ist es möglich, die obige Ausgabe in Schwein zu bekommen. Das ist eine Art Union und verbindet beides.

Antwort

1

Wie Sie Gewerkschaften tun können und verbindet in Schwein ist dies natürlich möglich.

Ohne in die genaue Syntax zu graben, kann ich Ihnen sagen, dies sollte funktionieren (ähnliche Lösungen in der Vergangenheit verwendet haben).

  1. Angenommen, haben wir A und B.
  2. Nehmen Sie die ersten beiden Spalten von A und B A2 und B2
  3. Union A2 und B2 in M2 sein
  4. Distinct M2

Jetzt haben Sie Ihre "Index" -Matrix, und wir müssen nur die zusätzlichen Spalten hinzufügen.

  1. Left M2 verbinden mit A und B
  2. Generieren Sie die relevanten Spalten

Das ist es!

1
A = load 'pdemo/File1' using PigStorage(',') as(id:int,name:chararray,age:chararray); 
B = load 'pdemo/File2' using PigStorage(',') as(id:int,name:chararray,grades:chararray); 

lj = join A by id left outer,B by id; 
rj = join A by id right outer,B by id; 

lj1 = foreach lj generate A::id as id,A::name as name,A::age as age,B::grades as grades; 
rj1 = foreach rj generate B::id as id,B::name as name,A::age as age,B::grades as grades; 

res = union lj1,rj1; 
FinalResult = distinct res; 

zweiter Ansatz ist besser nach Leistung

A1 = foreach A generate id,name; 
B1 = foreach B generate id,name; 

M2 = union A1,B1; 
M2 = distinct M2; 

M2A = JOIN M2 by id left outer,A by id; 
M2AB = JOIN M2A by M2::id left outer, B by id; 

Res = foreach M2AB generate M2A::M2::id as id,M2A::M2::name as name,M2A::A::age as age,B::grades as grades; 

Hope this helfen !!

+1

Ich würde erwarten, dass dies funktioniert, aber man sollte erkennen, dass das Abschneiden am Ende bedeutet, dass die Speicheranforderungen deutlich höher sein können als für die von mir vorgeschlagene Lösung. - Im Grunde genommen machst du einen versteckten vollen Outer-Join, also denke ich, dass du das genauso gut verwenden könntest, anstatt rechts und links zu Joins. –

+0

Dies hilft, ich werde versuchen, dies für zwei beliebige Dateien zu automatisieren (mit variablen Spalten und variablen gemeinsamen Spalten). Wenn Sie darüber nachdenken, schlagen Sie bitte vor. – Prometheus

0
u1 = load 'PigDir/u1' using PigStorage(',') as (id:int,name:chararray,age:int); 
u2 = load 'PigDir/u2' using PigStorage(',') as (id:int, name:chararray,grades:chararray); 

uj = join u2 by id full outer,u1 by id; 

uif = foreach uj generate ($0 is null ?$3:$0) as id,($1 is null ? $4 : $1) as name,$5 as age,$2 as grades;