我有一个如下所示的输入关系 X
:
a:chararray, b:chararray, c:(d:chararray, e:(f:chararray, g:chararray))
我想在单个生成语句中从句法上再次生成那个精确 元组。这行不通,但希望它能很好地说明我所追求的:
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
类型是公平的——也就是说,没有包、映射等的任意嵌套元组。
感谢您的帮助!
编辑:我已经接近了一点。这几乎有效:
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) 右边有一个额外的元组“层”,这在语法上是不可能匹配的。
最佳答案
一种方法是
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));
关于hadoop - 在 Pig 中生成任意嵌套的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25336101/