1

結合する 2 つのデータ セットがあります。それらは次のようになります。

 Dataset 1
 ---#----#----#------------#----#-----#-----
 F1 | F2 | F3 | UID        | F4 | ... | F32
 ---#----#----#------------#----#-----#-----
 a1 | b1 | c1 | MD5 value1 | d1 | ... | foo1
 a2 | b2 | c2 | MD5 value2 | d2 | ... | foo2
 a3 | b3 | c3 | MD5 value3 | d3 | ... | foo3
 a4 | b4 | c4 | MD5 value4 | d4 | ... | foo4

 Dataset 2
 ----#-----#--------------#-----#-----#-----
 Z1  | Z2  | UID+Constant | Z3  | ... | Z62
 ----#-----#--------------#-----#-----#-----
 p1  | q1  | MD5 value1+C | s1  | ... | t1
 p2  | q2  | MD5 value2+C | s2  | ... | t2
 p3  | q3  | MD5 value3+C | s3  | ... | t3
 p4  | q4  | MD5 value4+C | s4  | ... | t4

ここで、明示的なフィールド名を使用して両方のデータセットをロードしました。

D1 = LOAD '/dataset1' USING PigStorage(',')
     AS (F1:chararray, F2:chararray, F3:chararray, UID:chararray, ... , F32:chararray);

D2 = LOAD '/dataset2' USING PigStorage(',')
     AS (Z1:chararray, Z2:chararray, UID_C:chararray, ... , Z62:chararray);

ここで、UID 値に参加するときに、両方のデータセットから結合された出力を取得したいと考えています。そこで、 を使用してUID_Cフィールドを分割しました。これが私がそれをした方法です。D2REGEX_EXTRACT_ALL

D2_SPLIT_UID_C = FOREACH D2 GENERATE *,
                    FLATTEN(REGEX_EXTRACT_ALL(UID_C, '^(.*)\+(.*)$'))
                        AS (UID:chararray, C:chararray);

そして、UID両方のデータセットに参加します。

JOINED_DATA = JOIN D1 BY UID, D2_SPLIT_UID_C BY UID;

ここまでは問題ありませんが、ここでは、UID_Cフィールドなしで出力を生成する必要があります。代わりに、 の値に置き換える必要がありますUIDConstant(C)また、最終出力には必要ありません。

したがって、最初に からD1、次に からデータを生成する必要がありD2ます。これが私の最終出力の出力ヘッダーです

---#----#----#------------#----#-----#-----#----#----#-----#----#-----#----
F1 | F2 | F3 | UID        | F4 | ... | F32 | Z1 | Z2 | UID | Z3 | ... | Z62
---#----#----#------------#----#-----#-----#----#----#-----#----#-----#----

これは醜いところです。最終的な .dataset1 と dataset2 のすべてのフィールドを再度配置する必要がありますFOREACH GENERATE F1, F2, F3, UID, ...., F32, Z1, Z2, UID, Z3, ...., Z62。このように、スキーマが明日変更された場合、ここでも更新する必要があります。

UID_C列の値を UID 値に置き換えることはできませんFOREACH GENERATE *か?

4

1 に答える 1

1

project-range式を使用して、フィールド範囲を定義できます。たとえば、
UID_C と MD5 合計の後の定数をスキップします。

D2_SPLIT_UID_C = FOREACH D2 GENERATE Z1 .. Z2, Z3 .. Z62, 
  FLATTEN(REGEX_EXTRACT(UID_C, '^(.*)\\+.*$', 1)) AS (UID:chararray);
于 2013-05-30T16:21:31.547 に答える