压扁袋不按预期工作

doinxwow  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(329)

输入:具有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中压平袋子的信息。

tyu7yeag

tyu7yeag1#

这里的问题是,如果不为 map ,默认为 bytearray ,如官方文件所示:

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 . 如果你执行 dumpC 它仍然可以工作,因为您没有对数据进行任何实际操作,只是对数据进行投影。但是,一旦你打电话给 FLATTEN 它将期望收到一个 DataBag ,并且在尝试 bytearray 去吧。
它在第二种情况下工作的原因是您正确地指示了Map的模式,这是一个 bag ,因此它不会得到默认值,即 bytearray :

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

编辑
抱歉,我没有看到第二种情况下你没有使用 map ,您正在直接使用 bag . 如果你想使用 map ,您只要指明模式即可避免上述情况:

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

dump B;
(bofa)
(chase)

相关问题