FLATTEN 或 SUBSTRING 与 Pig 中的 JOIN 混淆

Posted

技术标签:

【中文标题】FLATTEN 或 SUBSTRING 与 Pig 中的 JOIN 混淆【英文标题】:FLATTEN or SUBSTRING messes with JOIN in Pig 【发布时间】:2017-04-22 08:55:23 【问题描述】:

我有两个数据集,data1data2

data2有以下数据,

a1:u:11#eve:f:6
a1:u:12#eve:f:6
a1:u2:13#eve:f:3
a1:u1:12#eve:s:6
a1:u1:11#eve:f:6

这里:# 是分隔符。我最终生成data2

LOAD '$data2' USING PigStorage(':') AS
                 (ad: chararray,
                  a_id: chararray,
                  cid_eve1: chararray,
                  name: chararray,
                  len: int);

然后我将第三列分成两列,

FOREACH data2 GENERATE
                  ad AS ad,
                  a_id AS a_id,
                  FLATTEN(STRSPLIT(cid_eve1, '#')) AS (cid: int, eve1: chararray),
                  name AS name,
                  len AS len;

现在,当我加入 data2data1 时,我什么也得不到。

我也试过了,

FOREACH data2 GENERATE
                  ad AS ad,
                  a_id AS a_id,
                  SUBSTRING(cid_eve1,0,INDEXOF(cid_eve1,'#',0)) AS cid: int,
                  name AS name,
                  len AS len;

这在加入时也不会返回任何内容。我将加入第三列,cid

我什至已经为这两种情况转储了data2 并查看了输出。这是预期的。但是当我使用以下文件作为data2时,

a1:u:11:eve:f:6
a1:u:12:eve:f:6
a1:u2:13:eve:f:3
a1:u1:12:eve:s:6
a1:u1:11:eve:f:6

并加载为,

LOAD '$data2' USING PigStorage(':') AS
             (ad: chararray,
              a_id: chararray,
              cid: int,
              eve1: chararray,
              name: chararray,
              len: int);

然后连接返回正确的结果。我不知道为什么会这样。有人可以帮忙或提供任何建议吗?

data1,第二列($1)是a_id,最后一列是cid。两者都加入。

1,u,true,true,4,1,1,1,1,1,11,21,31,11
1,u,true,true,4,1,1,1,1,1,11,21,32,11
1,u,true,true,4,1,1,1,1,1,11,21,33,11
1,u,true,true,4,1,1,1,1,1,11,21,31,11
1,u,true,true,4,1,1,1,1,1,11,21,32,11
1,u,true,true,4,1,1,1,1,1,11,21,33,11
2,u,true,true,4,1,1,1,1,1,12,22,34,12
2,u,true,true,4,1,1,1,1,1,13,22,35,13
2,u1,true,false,4,1,1,1,1,0,12,22,34,12
2,u1,true,false,4,1,1,1,1,0,13,22,35,13
2,u1,true,true,9,1,1,1,1,1,12,22,34,12
2,u1,true,true,9,1,1,1,1,1,13,22,35,13
3,u,false,false,4,1,0,1,0,0,14,24,31,14
3,u,false,false,4,1,0,1,0,0,11,22,31,11
4,u,true,NULL,0,1,1,0,0,0,11,22,33,11
4,u1,false,NULL,0,1,0,0,0,0,11,22,33,11
2,u,true,true,4,1,1,1,1,1,12,22,34,12
2,u,true,true,4,1,1,1,1,1,13,22,35,13
2,u2,true,true,7,1,1,1,1,1,12,22,34,12
2,u2,true,true,7,1,1,1,1,1,13,22,35,13

【问题讨论】:

【参考方案1】:

我找到了答案。问题在于数据类型。我试图将chararray 读入int,但没有进行类型转换。

当我把它改成,

FOREACH data2 GENERATE
              ad AS ad,
              a_id AS a_id,
              (int)SUBSTRING(cid_eve1,0,INDEXOF(cid_eve1,'#',0)) AS cid,
              name AS name,
              len AS len;

成功了。

【讨论】:

以上是关于FLATTEN 或 SUBSTRING 与 Pig 中的 JOIN 混淆的主要内容,如果未能解决你的问题,请参考以下文章

猪:FLATTEN关键字

展平字符串后 Pig 中的模式

Pig 0.12.0 - 从字符串中提取最后两个字符

如何计算 Apache Pig 中字符串的长度?

Pig Latin 中的 AVG() 函数问题

Apache Pig Group / 展平 / 加入