在Pig中加入FLINTEN或SUBSTRING混乱

时间:2017-04-22 08:55:23

标签: apache-pig

我有两个数据集,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);

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

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;

加入时也不返回任何内容。我正在加入第3栏,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 个答案:

答案 0 :(得分:0)

我找到了答案。问题在于数据类型。我试图将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;

有效。