我有使用猪的问题像这样: 假设我有一个别名A,比如(“key1”,“just_for_example”)。我想要类似:(“key1”,“just”),(“key1”,“for”),(“key1”,“example”)。我的脚本看起来像:
B = foreach A生成$ 0,FLATTEN(TOBAG(FLATTEN(STRSPLIT($ 1,'_'))));
但它一直让我误以为“错误1070:无法从内置解决Flatten”。但是,一旦我将这个陈述分成两个以消除嵌套的扁平化,那么它就可以了。这是为什么?它与Pig如何编译我的脚本有关吗?感谢。
答案 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;