嵌套在猪中展平

时间:2013-07-12 01:48:26

标签: hadoop apache-pig

我有使用猪的问题像这样: 假设我有一个别名A,比如(“key1”,“just_for_example”)。我想要类似:(“key1”,“just”),(“key1”,“for”),(“key1”,“example”)。我的脚本看起来像:

B = foreach A生成$ 0,FLATTEN(TOBAG(FLATTEN(STRSPLIT($ 1,'_'))));

但它一直让我误以为“错误1070:无法从内置解决Flatten”。但是,一旦我将这个陈述分成两个以消除嵌套的扁平化,那么它就可以了。这是为什么?它与Pig如何编译我的脚本有关吗?感谢。

3 个答案:

答案 0 :(得分:0)

展平不是一个功能 - 你无法嵌套它。

但是,在您的情况下,我认为您不必使用它两次。这应该足以获得您想要的输出:

B = foreach A generate $0, FLATTEN(STRSPLIT($1,'_'));

答案 1 :(得分:0)

Flatten不是UDF,它是一个改变包和元组格式的运算符。您可以阅读说明here

虽然您可以在干净的单行中获得所需的输出。 TOKENIZE与STRSPLIT的工作方式类似,但是生成一个包而不是一个元组。因此,您可以这样做:

B = FOREACH A GENERATE $0, FLATTEN(TOKENIZE($1, '_')) ;

产生的架构和输出:

B: {key: chararray,bag_of_tokenTuples::token: chararray}
(key1,just)
(key1,for)
(key1,example)

答案 2 :(得分:0)

我试图复制你的问题,请在下面找到我的解决方案。已将flatten_exe.txt作为包含数据的输入(“Just_For_example”)

grunt> flt= Load '/home/training/pig/Join/flatten_exe.txt' using PigStorage();

grunt> b= Foreach flt Generate FLATTEN(TOKENIZE($0, '_'));  

grunt>dump b;