Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 使用spark读取avro数据并获得org.apache.avro.util.Utf8无法转换为java.lang.String异常_Hadoop_Apache Spark_Avro - Fatal编程技术网

Hadoop 使用spark读取avro数据并获得org.apache.avro.util.Utf8无法转换为java.lang.String异常

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") }); 加载部分工作正常,但转换为字符串

我使用以下代码读取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中使用该库时,由于上述异常,它失败了

我知道我可以将代码更改为
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") });