gpt4 book ai didi

hadoop - 使用spark读取avro数据并无法将org.apache.avro.util.Utf8强制转换为java.lang.String异常

转载 作者:行者123 更新时间:2023-12-02 21:34:49 27 4
gpt4 key购买 nike

我正在使用以下代码在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贴图减少作业中很好用。但是,当我现在在spark中使用该库时,由于上述异常,它失败了。

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

综上所述,如何使 org.apache.avro.util.Utf8中的所有 GenericRecord自动转换为 java.lang.String

最佳答案

看起来解决方案是使用AvroKey而不是AvroWrapper。下面的代码有效,所有org.apache.avro.util.Utf8都会自动转换为java.lang.String。也不异常(exception)。

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

关于hadoop - 使用spark读取avro数据并无法将org.apache.avro.util.Utf8强制转换为java.lang.String异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33088717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com