在Pig中生成任意嵌套的元组?

时间:2014-08-16 01:12:57

标签: hadoop apache-pig

我有一个输入关系X,如下所示:

a:chararray, b:chararray, c:(d:chararray, e:(f:chararray, g:chararray))

我想在单个generate语句中再次在语法上再次生成 exact 元组。这不起作用,但希望它能给我一个很好的例子:

foreach x generate a as a, b as b, (d as d, (f as f, g as g) as e) as c

实际上,我正在生成代码以对该类型进行小编辑,所以答案如下:

foreach x generate *

...在这里没用。

是否有一种语法可以让我在Pig的单个生成语句中生成这样的任意嵌套结构?假设一个完全FLATTEN - ed类型是公平的,也就是说,任意嵌套的元组没有包,地图等。

感谢您的帮助!

编辑:我离得更近了。这个几乎有效:

x = LOAD 'data.json' USING JsonLoader('a:chararray, b:chararray') AS a:chararray, b:chararray;
y = foreach x generate (a, b, (a, b, (a, b))) as (a:chararray, b:chararray, tuple1:(a:chararray, b:chararray, tuple2:(a:chararray, b:chararray)));

在语义上,这是正确的事情,它在语法上是有效的,但它给了我这个错误:

Incompatable schema: left is "a:chararray,b:chararray,tuple1:tuple(a:chararray,b:chararray,tuple2:tuple(a:chararray,b:chararray))", right is "org.apache.pig.builtin.totuple_b_3:tuple(a:chararray,b:chararray,org.apache.pig.builtin.totuple_b_2:tuple(a:chararray,b:chararray,org.apache.pig.builtin.totuple_b_1:tuple(a:chararray,b:chararray)))"

...这对我来说似乎很奇怪,因为(a)两个模式应该匹配,或者(b)右边有一个额外的元组“层”,在语法上是不可能匹配的。

1 个答案:

答案 0 :(得分:2)

一种方法可能是

y = foreach x generate a,b,
    TOTUPLE(c.d,TOTUPLE(c.e.f,c.e.g)) 
         as c:(d:chararray,e:(f:chararray,g:chararray));