【问题标题】:use spark to read avro data and got org.apache.avro.util.Utf8 cannot be cast to java.lang.String Exception使用 spark 读取 avro 数据并得到 org.apache.avro.util.Utf8 cannot be cast to java.lang.String Exception
【发布时间】:2015-10-12 19:23:11
【问题描述】:

我正在使用以下代码在 spark 中读取 avro:

val inputData = sc.hadoopFile(inputPath,
  classOf[AvroInputFormat[GenericRecord]],
  classOf[AvroWrapper[GenericRecord]]).map(t => 
{ val genericRecord = t._1.datum()  
(String)genericRecord.get("name") });

加载部分工作正常,但转换为字符串部分失败:

Caused by: java.lang.ClassCastException: org.apache.avro.util.Utf8 cannot be cast to java.lang.String

为了简化示例,我使用一行

(String)genericRecord.get("name") 

实际上,该部分来自一个库,在 hadoop map reduce 作业中使用得很好。但是,当我现在在 spark 中使用该库时,由于上述异常,它失败了。

我知道我可以将代码更改为genericRecord.get("name").toString() 以使其工作,但是因为我在另一个hadoop mapreduce 作业中使用它很好,我希望所有的utf8 都可以自动转换为字符串,这样我就不会需要更改所有代码逻辑。

总结一下,如何让GenericRecord中的所有org.apache.avro.util.Utf8自动转换成java.lang.String

【问题讨论】:

    标签: hadoop apache-spark avro


    【解决方案1】:

    看起来解决方案是使用AvroKey 而不是AvroWrapper。以下代码有效,所有org.apache.avro.util.Utf8 将自动转换为java.lang.String。再也不例外了。

    val inputData = sc.newAPIHadoopFile(inputPath,
    classOf[AvroKeyInputFormat[GenericRecord]],
    classOf[AvroKey[GenericRecord]],
    classOf[NullWritable]).map(t => 
    { val genericRecord = t._1.datum()  
    (String)genericRecord.get("name") });
    

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2022-12-04
      • 1970-01-01
      • 2016-12-06
      • 2018-06-22
      相关资源
      最近更新 更多