1

我在使用 Pig 时遇到问题 像这样:假设我有一个别名 A,例如 ("key1","just_for_example")。我想要这样的东西:(“key1”,“just”),(“key1”,“for”),(“key1”,“example”)。我的脚本看起来像:

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

但它不断向我抛出错误,例如“错误 1070:无法从内置解决扁平化”。但是,一旦我将此语句分成两部分以消除嵌套的扁平化,那么它就起作用了。这是为什么?它与 Pig 如何编译我的脚本有关吗?谢谢。

4

3 回答 3

0

Flatten 不是一个函数——你不能嵌套它。

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

B = foreach A generate $0, FLATTEN(STRSPLIT($1,'_'));
于 2013-07-14T07:34:49.490 回答
0

Flatten 不是 UDF,它是一个改变包和元组格式的操作符。您可以在此处阅读说明。

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

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

生成的架构和输出:

B: {key: chararray,bag_of_tokenTuples::token: chararray}
(key1,just)
(key1,for)
(key1,example)
于 2013-07-18T18:18:55.083 回答
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;
于 2014-09-07T17:29:21.697 回答