FLATTEN袋子没有按预期工作

时间:2015-06-01 02:25:25

标签: apache-pig flatten bag

输入:具有地图数据的a.csv文件

[banks#{(bofa),(chase)}]

猪脚本:

A = LOAD 'a.csv' AS (bank_details:map[]);
B = FOREACH A GENERATE FLATTEN(bank_details#'banks') AS bank_name;

输出:B:

({(bofa),(chase)})

在包上应用Flatten

C = FOREACH A GENERATE bank_details#'banks' AS banks: bag{t:(bank:chararray)};
D = FOREACH C GENERATE FLATTEN(banks);

输出:D:

org.apache.pig.backend.executionengine.ExecException: ERROR 0: Exception while executing [POProject (Name: Project[bag][0] - scope-114 Operator Key: scope-114) children: null at []]: java.lang.ClassCastException: org.apache.pig.data.DataByteArray cannot be cast to org.apache.pig.data.DataBag
at org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.getNext(PhysicalOperator.java:366)

预期输出:

(bofa)
(chase)

如果输入文件有一个包如下:

输入:a.csv

{(bofa),(chase)}

猪脚本:

A = LOAD 'a.csv' AS (bank_details:bag{t:(bank_name:chararray)});
B = FOREACH A GENERATE FLATTEN(bank_details) AS bank_name;

输出:B:生成展平结果

(bofa)
(chase)

我们无法在别名C和D中展平行李的任何输入。

1 个答案:

答案 0 :(得分:1)

这里的问题是,如果您没有为map指定架构,则默认为bytearray,您可以在official documentation中看到:

A = LOAD 'a.csv' AS (bank_details:map[]);
B = FOREACH A GENERATE FLATTEN(bank_details#'banks') AS bank_name;
describe B;
B: {bank_name: bytearray}

因此,当您尝试将其投放到bag时,会产生ClassCastException,因为DataByteArray无法投放到DataBag。如果您在dump上执行C,它仍然有效,因为您没有对数据进行任何实际操作,只是将其投影。但是,一旦您调用FLATTEN函数,它就会收到DataBag,但在尝试将bytearray投射到该函数时会失败。

它适用于您的第二种情况的原因是您正确指示了地图的架构,即bag,因此它不会获得默认值,即{{1 }}:

bytearray

修改

抱歉,我没有看到在第二种情况下您没有使用A = LOAD 'a.csv' AS (bank_details:bag{t:(bank_name:chararray)}); ,而是直接使用map。如果您想使用bag,只要您指明架构以避免上述内容:

map