FLATTEN 或 SUBSTRING 与 Pig 中的 JOIN 混淆
Posted
技术标签:
【中文标题】FLATTEN 或 SUBSTRING 与 Pig 中的 JOIN 混淆【英文标题】:FLATTEN or SUBSTRING messes with JOIN in Pig 【发布时间】:2017-04-22 08:55:23 【问题描述】:我有两个数据集,data1
和 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
这里:
和#
是分隔符。我最终生成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;
现在,当我加入 data2
和 data1
时,我什么也得不到。
我也试过了,
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 混淆的主要内容,如果未能解决你的问题,请参考以下文章