展平仅返回 char 数组中的第一项
Flatten returing only the first item in chararray
我有以下数据(加载到变量 A):
(a1:a2:a3|a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3|c4:c5:c6|c7:c8:c9)
我希望我的最终输出如下:
(a1:a2:a3)
(a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3)
(c4:c5:c6)
(c7:c8:c9)
这是我所做的:
B = foreach B generate flatten(STRSPLIT([=12=], '\|')) as splitted:chararray;
这将数据转换为:
(a1:a2:a3,a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3,c4:c5:c6,c7:c8:c9)
具有以下结构:
B: {splitted: chararray}
但是,当我尝试将此字符数组展平为单独的元组时,它只会吐出第一项。我尝试了几种不同的方法来获得我想要的输出,但我总是得到第一个项目。以下是我尝试过的几件事:
req_output = foreach B generate flatten(STRSPLIT(splitted, ','));
req_output = foreach B generate flatten(TOBAG(*));
在这两种情况下,我都得到以下输出:
(a1:a2:a3)
(b1:b2:b3)
(c1:c2:c3)
我不确定为什么会这样。如何将所有项目作为不同的元组获取?我对猪没有太多经验,所以任何帮助将不胜感激。
在 relation B
中,您只存储了第一项(即 splitted variable
),这就是出现此问题的原因。你能从关系 B 中删除变量 splitted
吗?
B = foreach B generate flatten(STRSPLIT([=10=], '\|')) as splitted:chararray;
TO
B = foreach B generate flatten(STRSPLIT([=11=], '\|'));
您可以通过多种方式解决此问题。
输入:
a1:a2:a3|a4:a5:a6
b1:b2:b3
c1:c2:c3|c4:c5:c6|c7:c8:c9
选项 1:使用 TOKENIZE
A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(TOKENIZE(line,'\|'));
DUMP B;
选项 2:使用 STRSPLIT + TOBAG
A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(line,'\|'));
C = FOREACH B GENERATE FLATTEN(TOBAG(*));
DUMP C;
选项 3:使用 STRSPLITTOBAG(仅限 Pig 版本 0.14)
A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLITTOBAG(line,'\|'));
DUMP B;
输出:
(a1:a2:a3)
(a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3)
(c4:c5:c6)
(c7:c8:c9)
我有以下数据(加载到变量 A):
(a1:a2:a3|a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3|c4:c5:c6|c7:c8:c9)
我希望我的最终输出如下:
(a1:a2:a3)
(a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3)
(c4:c5:c6)
(c7:c8:c9)
这是我所做的:
B = foreach B generate flatten(STRSPLIT([=12=], '\|')) as splitted:chararray;
这将数据转换为:
(a1:a2:a3,a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3,c4:c5:c6,c7:c8:c9)
具有以下结构:
B: {splitted: chararray}
但是,当我尝试将此字符数组展平为单独的元组时,它只会吐出第一项。我尝试了几种不同的方法来获得我想要的输出,但我总是得到第一个项目。以下是我尝试过的几件事:
req_output = foreach B generate flatten(STRSPLIT(splitted, ','));
req_output = foreach B generate flatten(TOBAG(*));
在这两种情况下,我都得到以下输出:
(a1:a2:a3)
(b1:b2:b3)
(c1:c2:c3)
我不确定为什么会这样。如何将所有项目作为不同的元组获取?我对猪没有太多经验,所以任何帮助将不胜感激。
在 relation B
中,您只存储了第一项(即 splitted variable
),这就是出现此问题的原因。你能从关系 B 中删除变量 splitted
吗?
B = foreach B generate flatten(STRSPLIT([=10=], '\|')) as splitted:chararray;
TO
B = foreach B generate flatten(STRSPLIT([=11=], '\|'));
您可以通过多种方式解决此问题。
输入:
a1:a2:a3|a4:a5:a6
b1:b2:b3
c1:c2:c3|c4:c5:c6|c7:c8:c9
选项 1:使用 TOKENIZE
A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(TOKENIZE(line,'\|'));
DUMP B;
选项 2:使用 STRSPLIT + TOBAG
A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(line,'\|'));
C = FOREACH B GENERATE FLATTEN(TOBAG(*));
DUMP C;
选项 3:使用 STRSPLITTOBAG(仅限 Pig 版本 0.14)
A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLITTOBAG(line,'\|'));
DUMP B;
输出:
(a1:a2:a3)
(a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3)
(c4:c5:c6)
(c7:c8:c9)