2016-09-16 6 views
1

私は豚を使用して2つのファイルを結合/結合します。しかし、これは通常の組合とは異なる組合です。このように、これらのファイルの連合連合豚を使用して列ごとに2つのファイル

F1 : 
h1,h2,h3,h4 
a01,a02,a03,a04 
a11,a12,a13,a14 

F2 : 
h3,h4,h5,h6 
a23,a24,b01,b02 
a33,a34,b11,b12 

出力結果がでなければなりません:以下の私のファイル(H *は、ファイルのヘッダされている)です

FR : 
h1,h2,h3,h4,h5,h6 
a01,a02,a03,a04,, 
a11,a12,a13,a14,, 
,,a23,a24,b01,b02 
,,a33,a34,b11,b12 

もう一つの難点は、私はそれが一般的なようにしたいです動的な数の共通の列に対しても機能します。現在、2つの一般的な列があります.3つまたは1つの共通の列を持つことも、共通の列を使用することもできません。例:

F1 : 
h1,h2,h3,h4 
a1,a2,a3,a4 

F2 
h5,h6,h7,h8 
b1,b2,b3,b4 

FR 
a1,a2,a3,a4 
,,,,b1,b2,b3,b4 

ヒント/ヘルプは相当です。ここで

答えて

0

は、あなたが静的にそれを行うことができる方法である。

F1full = FOREACH F1 GENERATE h1,h2,h3,h4, NULL as h5, NULL as h6; 
F2full = FOREACH F2 GENERATE NULL as h1,NULL as h2,h3,h4, h5, h6; 

FR = F1full UNION F2full; 

豚は非常に柔軟ではないので、私は一般的なケースのために/動的にこれを生成することが可能であるとは思いません。

一般的なケースの解決策が必要な場合は、pythonなどの言語を使用して、格納されているテーブル/ファイルのメタデータに基づいて必要なコマンドを作成できます。

0

私は、次のアプローチを使用して問題を解決しようとした:

1) Load both of the files. 
2) Add counter to generate a unique field (ID). 
3) Start the counter for file B where counter for A ended. 
4) Cogroup both files with common columns, including counteer. 
5) Take all group columns in a different schema. 
6) Generate uncommon columns from both files, along with the counter. 
7) First join uncommon columns from file A with group columns on counter. 
8) Join the result of step 7 with uncommon columns from file B on counter. 

は次のように同じことを行うには豚のスクリプトです。このスクリプトは一般的なものなので、スクリプトを実行する前にすべてのパラメータが必要であると述べました。

-- Parameters required : $file1_path, $file2_path, $file1_schema, $file2_schema, $COUNT_A (number of rows in file A), $CMN_COLUMN_A (common columns in A), $CMN_COLUMN_B, $UNCMN_COLUMN_A(Unique columns in file A), $UNCMN_COLUMN_B. 
A = LOAD '$file1_path' USING org.apache.pig.piggybank.storage.CSVExcelStorage('~', 'NO_MULTILINE', 'NOCHANGE', 'SKIP_INPUT_HEADER') as ($file1_schema); 
B = LOAD '$file2_path' USING org.apache.pig.piggybank.storage.CSVExcelStorage('~', 'NO_MULTILINE', 'NOCHANGE', 'SKIP_INPUT_HEADER') as ($file2_schema); 

RANK_A = RANK A; 
RANK_B = RANK B; 
COUNT_RANK_B = FOREACH RANK_B GENERATE ($0+(long)'$COUNT_A') as rank_B, $1 ..; 

COGRP_RANK_AB = COGROUP RANK_A BY($CMN_COLUMN_A), COUNT_RANK_B BY ($CMN_COLUMN_B); 

CMN_COGRP_RANK_AB = FOREACH COGRP_RANK_AB GENERATE FLATTEN(group) AS ($CMN_COLUMN_A); 
UNCMN_RB = FOREACH COUNT_RANK_B GENERATE $UNCMN_COLUMN_B; 

JOIN_CMN_UNCMN_A = JOIN CMN_COGRP_RANK_AB BY(rank_A) LEFT OUTER, UNCMN_RA by rank_A; 
JOIN_CMN_UNCMN_B = JOIN JOIN_CMN_UNCMN_A BY(CMN_COGRP_RANK_AB::rank_A) LEFT OUTER, UNCMN_RB by rank_B; 

STORE FINAL_DATA INTO '$store_path' USING org.apache.pig.piggybank.storage.CSVExcelStorage('~', 'NO_MULTILINE', 'UNIX', 'WRITE_OUTPUT_HEADER'); 
+0

これは、どの列がテーブルごとに一意で共通であるかを手動で指定する必要がありますか?あるいは、入力変数を提供するプログラム的な方法がありますか? –

+0

私はプログラムですべての変数を見つけるこのスクリプトのラッパーを持っています。私はn個のファイルを結合するために同じスクリプトを使用しているので、すべてのファイルを手動で提供することはできません。 – Prometheus

関連する問題