hadoop 将数据类型转换为HashMap时出错:无法将org.apache.avro.util.Utf8强制转换为java.util.HashMap

hxzsmxv2  于 2022-11-21  发布在  Hadoop
关注(0)|答案(1)|浏览(351)

我正在读取一个 parquet 文件,其中包含字段domainIdentityId
但是,当它尝试将值放入HashMap时,它会给我这个错误:
org.apache.avro.util.Utf8 cannot be cast to java.util.HashMap

  1. def read(path: String): Seq[Map[String, String]] = {
  2. val inputFile = HadoopInputFile.fromPath(new Path("/Users/MyUser/TEST/test-compression/part-test-b67081e8-e829-421d-test-test.c000.snappy.parquet"), configs)
  3. val reader = AvroParquetReader.builder[GenericRecord](inputFile).build()
  4. val records = new ListBuffer[Map[String, String]]()
  5. var i = Option(reader.read)
  6. while (i.isDefined) {
  7. val featureHashMap = i.get.get("domainId").asInstanceOf[java.util.HashMap[Utf8, Utf8]]
  8. records += featureHashMap
  9. .asScala
  10. .map(i => {
  11. (i._1.toString, i._2.toString)
  12. })
  13. .toMap
  14. i = Option(reader.read)
  15. }
  16. records
  17. }

我尝试将Utf8更改为Stringjava.util.HashMap[String, String]),但仍然出现相同的错误。
我能做些什么让HashMap接受Utf8吗?

k97glaaz

k97glaaz1#

无法将org.apache.avro.util.Utf8强制转换为java.util.HashMap
这意味着asInstanceOf调用不能将Utf8值转换为HashMap值,因为类型不兼容。不管HashMap的类型参数是什么,它永远不会是Utf8。即使您修复了这个特定的错误,使用asInstanceOf也总是有这种失败的风险。
更好的解决方案是使用match而不是asInstanceOf。一个case可以匹配您所期望的类型,并将安全地将类型缩小到您所需的类型。第二个case可以处理其他类型,并根据需要提供默认值或错误值。
在这种情况下,domainId字段似乎只是一个Utf8字符串,因此您可能需要进一步处理它以创建HashMap,或者修改您的逻辑以处理Utf8值。

相关问题