PIG:无法在存储中使用AvroStorage将java.lang.String转换为org.apache.avro.util.Utf8

时间:2014-03-18 18:59:02

标签: java hadoop apache-pig avro

我正在使用Apache PIG来减少最初以CSV格式存储并希望在Avro中输出的数据。我的PIG脚本的一部分调用一个java UDF,它将几个字段附加到输入Tuple并传回修改后的Tuple。我在使用以下方法修改输出,PIG和模式:

Schema outSchema = new Schema(input).getField(1).schema;
Schema recSchema = outSchema.getField(0).schema;
recSchema.add(new FieldSchema("aircrafttype", DataType.CHARARRAY));

在我的UDF的public Schema outputSchema(Schema input)方法中。

exec方法中,我将java.lang.String值附加到输入元组并将编辑后的元组返回到PIG脚本。这和所有后续操作都可以正常工作。如果我使用PigStorage(',')输出为CSV格式,则没有问题。当我尝试使用

输出时
STORE records INTO '$out_dir' USING org.apache.pig.piggybank.storage.avro.AvroStorage('
{
"schema":{ 
  "type":"record", "name":"my new data",
  "fields": [
    {"name":"fld1", "type":"long"},
    {"name":"fld2", "type":"string"}
  ]}
}');

我收到以下错误:

java.io.IOException: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.avro.util.Utf8

我尝试将字符字段附加到元组(在我的UDF中)作为char[]Utf8类型,但这使得PIG在我尝试写出数据之前感到愤怒。我还尝试修改我的Avro架构以允许每个字段中的空类型。

我正在使用PIG v0.11.1和Avro v1.7.5,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是一个PIG版本问题。我的UDF内置于包含PIG v0.8.1的依赖jar的jar中。 PIG版本0.8.1和0.11.1的混合导致了这些问题,AVRO与它无关。