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

标签 hadoop apache-pig

我有一个如下所示的输入关系 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/

相关文章:

java - org.apache.hadoop.mapred.FileAlreadyExistsException 异常

java - Cloudera Manager 4.0 字数统计示例

macos - 找不到 pig-core-h2.jar。执行 'ant -Dhadoopversion=23 jar' ,然后重试

hadoop - 将 DataStage 代码逆向工程到 Pig(用于 Hadoop)

hadoop - 在 pig 中使用加载数据流步骤与使用(使用 PigStorage)和不使用它有什么区别?

java - 用于编写和运行 hadoop 作业的 IDE?

java - Storm Trident中的批处理大小

python - 当记录不按顺序时,df1 减去 df2 在 Pyspark 中无法按预期工作

apache-pig - pig -如何在JOIN之后引用FOREACH中的列?

hadoop - Cloudera Impala是内存消耗框架吗?