输入:具有Map数据的.csv文件
[banks#{(bofa),(chase)}]
Pig脚本:
A = LOAD 'a.csv' AS (bank_details:map[]);
B = FOREACH A GENERATE FLATTEN(bank_details#'banks') AS bank_name;
输出:b:
({(bofa),(chase)})
在包上应用压扁
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)}
Pig脚本:
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条答案
按热度按时间tyu7yeag1#
这里的问题是,如果不为
map
,默认为bytearray
,如官方文件所示:因此,当你试着把它抛向
bag
这将导致ClassCastException
因为DataByteArray
不能强制转换为DataBag
. 如果你执行dump
在C
它仍然可以工作,因为您没有对数据进行任何实际操作,只是对数据进行投影。但是,一旦你打电话给FLATTEN
它将期望收到一个DataBag
,并且在尝试bytearray
去吧。它在第二种情况下工作的原因是您正确地指示了Map的模式,这是一个
bag
,因此它不会得到默认值,即bytearray
:编辑
抱歉,我没有看到第二种情况下你没有使用
map
,您正在直接使用bag
. 如果你想使用map
,您只要指明模式即可避免上述情况: