我正在使用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,非常感谢任何帮助。
答案 0 :(得分:0)
这是一个PIG版本问题。我的UDF内置于包含PIG v0.8.1的依赖jar的jar中。 PIG版本0.8.1和0.11.1的混合导致了这些问题,AVRO与它无关。