猪:无法将 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]

使用 Spark SQL 时无法将获取 B 转换为 java.lang.String

无法将类型“java.lang.String”的属性值转换为属性“事务”所需的类型“java.util.List”