猪:无法将 java.lang.String 转换为 org.apache.avro.util.Utf8 与 STORE 中的 AvroStorage
Posted
技术标签:
【中文标题】猪:无法将 java.lang.String 转换为 org.apache.avro.util.Utf8 与 STORE 中的 AvroStorage【英文标题】:PIG: Cannot cast java.lang.String to org.apache.avro.util.Utf8 with AvroStorage inside STORE 【发布时间】:2014-03-18 18:59:01 【问题描述】:我正在使用 Apache PIG 来减少最初以 CSV 格式存储并希望在 Avro 中输出的数据。我的 PIG 脚本的一部分调用了一个 java UDF,它将一些字段附加到输入元组并将修改后的元组传回。这样做时,我正在修改输出、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
我尝试将字符字段作为char[]
和Utf8
类型附加到元组(在我的UDF 中),但这让PIG 在我试图写出数据之前就生气了。我还尝试修改我的 Avro 架构以允许在每个字段中使用 null 类型。
我正在使用 PIG v0.11.1 和 Avro v1.7.5,非常感谢任何帮助。
【问题讨论】:
【参考方案1】:这是一个 PIG 版本问题。我的 UDF 内置在一个带有依赖项的 jar 中,包括 PIG v0.8.1。 PIG 0.8.1 和 0.11.1 版本的混合导致了问题,AVRO 与它无关。
【讨论】:
以上是关于猪:无法将 java.lang.String 转换为 org.apache.avro.util.Utf8 与 STORE 中的 AvroStorage的主要内容,如果未能解决你的问题,请参考以下文章
无法将 java.lang.String 类型的对象转换为 com.example 类型
无法将类型 [java.lang.String] 的属性值转换为所需类型 [java.lang.Integer]
如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;
无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]