2013-05-30 127 views
1

替换一个元组字段的值,我有两个数据集的加入。以下是他们的样子:

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值。因此,我使用REGEX_EXTRACT_ALLUID_C字段拆分为D2。这是我如何做到的。

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场输出。相反,我需要用UID的值替换它。另外,我的最终输出中不需要Constant(C)

所以,我需要从D2首先从D1,然后生成的数据。所以这里是我的最终输出的输出标题

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

这是它变得丑陋的地方。我需要将数据集1和数据集2中的所有字段再次放入我的最终FOREACH GENERATE F1, F2, F3, UID, ...., F32, Z1, Z2, UID, Z3, ...., Z62。这样,如果我的模式明天改变,我也必须在这里更新它。

我不能将UID_C列值替换为UID值,然后我只需要使用FOREACH GENERATE *,我会完成?

+0

如果它是一个常数,你只需要MD5,为什么地狱你使用正则表达式,而不是适当长度的“SUBSTRING”? – TC1

+0

我们希望常数以及后来出于不同的目的。 – divinedragon

回答

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); 
+0

但仍不能解决我的问题。其实这些字段名称是虚拟的。所以,'''Z3 .. Z62''''是不可能的。 – divinedragon