首先,我正在根据集群运行 Apache Pig 版本 0.11.0-cdh4.3.0(重新导出)。但是,我的构建使用 0.11.0-cdh4.5.0 我知道这不是一个明智的决定,但我认为这与我在这里遇到的问题无关,因为它都是 Pig v0.11.0
我有一个结构看起来像这样的脚本(两个自定义 udf 都返回 DataByteArray 类型,这是一个有效的 Pig 类型 afaik):
LOAD USING parquet.pig.ParquetLoader();
FOREACH GENERATE some of the fields
GROUP BY (a,b,c)
FOREACH GENERATE FLATTEN(group) AS (a,b,c), CustomUDF1(some_value) AS d
FOREACH GENERATE FLATTEN(CubeDimensions(a,b,c)) AS (a,b,c) , d
GROUP BY (a,b,c)
FOREACH GENERATE FLATTEN(group) AS (a,b,c), SUM(some_value), CustomUDF2(some_value)
STORE USING parquet.pig.ParquetStorer();
Pig 将其拆分为两个 mapreduce 作业。我不确定 CubeDimensions 是发生在第一个还是第二个,但我怀疑它发生在第一个工作的 reduce 阶段。
所以第二个工作的映射阶段只不过是读取中间数据,这就是发生这种情况的地方:
“在流中发现意外的数据类型 49。” @ org.apache.pig.data.BinInterSedes:422
我已经看到数字是 48 和 49 并且在 BinInterSedes 类中都不存在:
但由于这是猪自己的中间输出,我不太明白它可能出错的地方。我的自定义 UDF 都返回一个有效类型,我希望 Pig 肯定只使用它知道的类型进行存储。
任何帮助将不胜感激。