2013-07-12 60 views
1

我有使用猪的问题像这样: 假设我有一个别名A,如(“key1”,“just_for_example”)。我想要的东西像:(“key1”,“just”),(“key1”,“for”),(“key1”,“example”)。我的脚本如下所示:嵌套展平猪

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

但它一直抛出我错误,如“错误1070:无法解决从内置Flatten”。但是,一旦我将这个语句分成两个来消除嵌套的flattens,那么它就可以工作。这是为什么?它与Pig如何编译我的脚本有关?谢谢。

回答

0

平展不是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) 
0

拼合不是一个功能 - 你不能嵌套它。

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

B = foreach A generate $0, FLATTEN(STRSPLIT($1,'_')); 
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;