Hadoop 替换Pig中元组中字段的值
我有两个数据集要连接。下面是它们的样子:Hadoop 替换Pig中元组中字段的值,hadoop,mapreduce,apache-pig,Hadoop,Mapreduce,Apache Pig,我有两个数据集要连接。下面是它们的样子: Dataset 1 ---#----#----#------------#----#-----#----- F1 | F2 | F3 | UID | F4 | ... | F32 ---#----#----#------------#----#-----#----- a1 | b1 | c1 | MD5 value1 | d1 | ... | foo1 a2 | b2 | c2 | MD5 value2 | d2 | ... |
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\u EXTRACT\u ALL
拆分D2
中的UID\u C
字段。我是这样做的
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\u C
字段的输出。相反,我需要将其替换为UID
的值。此外,我不需要在最终输出中使用常量(C)
因此,我需要首先从D1
生成数据,然后从D2
生成数据。这是我最终输出的输出头
---#----#----#------------#----#-----#-----#----#----#-----#----#-----#----
F1 | F2 | F3 | UID | F4 | ... | F32 | Z1 | Z2 | UID | Z3 | ... | Z62
---#----#----#------------#----#-----#-----#----#----#-----#----#-----#----
这就是它变得丑陋的地方。我需要再次将dataset1和dataset2中的所有字段放入最终的FOREACH生成F1、F2、F3、UID、…、F32、Z1、Z2、UID、Z3、…、Z62
。这样,如果我的模式明天改变,我也必须在这里更新它
我是否可以用UID值替换UID\u C
列值,然后我只需要使用FOREACH GENERATE*
就可以了?您可以使用表达式定义字段范围,例如:跳过UID_C以及MD5和之后的常量:
D2_SPLIT_UID_C = FOREACH D2 GENERATE Z1 .. Z2, Z3 .. Z62,
FLATTEN(REGEX_EXTRACT(UID_C, '^(.*)\\+.*$', 1)) AS (UID:chararray);
您可以使用表达式定义字段范围,例如:跳过UID_C以及MD5和之后的常量:
D2_SPLIT_UID_C = FOREACH D2 GENERATE Z1 .. Z2, Z3 .. Z62,
FLATTEN(REGEX_EXTRACT(UID_C, '^(.*)\\+.*$', 1)) AS (UID:chararray);
如果它是一个常数,你只需要MD5,那你为什么要使用正则表达式而不是适当长度的子字符串呢?我们以后也需要这个常数,但目的不同。如果它是常数,你只需要MD5,你为什么要用正则表达式而不是用适当长度的子字符串呢?我们以后也希望这个常量有不同的用途。但仍然不能解决我的问题。实际上,这些字段名是虚拟的。所以,
Z3。。Z62不可能。但仍然不能解决我的问题。实际上,这些字段名是虚拟的。所以,Z3。。Z62不可能。