替换pig中元组中字段的值

4xrmg8kj  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(396)

我有两个数据集要连接。下面是它们的样子:

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 字段输入 D2 使用 REGEX_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 现场。相反,我需要用 UID . 另外,我不需要 Constant(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 列值,然后我只需要使用 FOREACH GENERATE * 我就完蛋了?

kulphzqa

kulphzqa1#

可以使用“项目范围”表达式定义字段范围,例如:
跳过uid\u c以及md5 sum之后的常量:

D2_SPLIT_UID_C = FOREACH D2 GENERATE Z1 .. Z2, Z3 .. Z62, 
  FLATTEN(REGEX_EXTRACT(UID_C, '^(.*)\\+.*$', 1)) AS (UID:chararray);

相关问题