1

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

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

猪脚本:

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

输出:乙:

({(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 中压平袋子的任何输入。

4

1 回答 1

1

这里的问题是,当您没有为 a 指定架构时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}

因此,当您尝试将其强制转换为 abag时,将导致 aClassCastException因为DataByteArray无法强制转换为DataBag。如果您执行 a dumponC它仍然可以工作,因为您没有对数据进行任何实际操作,只是对其进行投影。但是,一旦您调用该FLATTEN函数,它将期望收到 a DataBag,并且在尝试将您的bytearray内容转换为它时会失败。

它在第二种情况下起作用的原因是您正确地指示了地图的架构,即 a bag,因此它不会获得默认值,即bytearray

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

编辑

抱歉,我没有看到在第二种情况下您没有使用 a map,而是直接使用 a bag。如果要使用 a 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)
于 2015-06-01T08:55:45.933 回答