Hadoop 使用spark读取avro数据并获得org.apache.avro.util.Utf8无法转换为java.lang.String异常
我使用以下代码读取spark中的avro:Hadoop 使用spark读取avro数据并获得org.apache.avro.util.Utf8无法转换为java.lang.String异常,hadoop,apache-spark,avro,Hadoop,Apache Spark,Avro,我使用以下代码读取spark中的avro: val inputData = sc.hadoopFile(inputPath, classOf[AvroInputFormat[GenericRecord]], classOf[AvroWrapper[GenericRecord]]).map(t => { val genericRecord = t._1.datum() (String)genericRecord.get("name") }); 加载部分工作正常,但转换为字符串
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中使用该库时,由于上述异常,它失败了
我知道我可以将代码更改为genericord.get(“name”).toString()
,以使其正常工作,但由于我在另一个hadoop mapreduce作业中使用它,我希望所有的utf8都可以自动转换为字符串,这样我就不需要更改所有的代码逻辑
总之,如何使
genericord
中的所有org.apache.avro.util.Utf8
自动转换为java.lang.String
解决方案似乎是使用AvroKey
而不是avrowraper
。在下面的代码工作时,所有的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") });