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

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

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

def read(path: String): Seq[Map[String, String]] = {
    val inputFile = HadoopInputFile.fromPath(new Path("/Users/MyUser/TEST/test-compression/part-test-b67081e8-e829-421d-test-test.c000.snappy.parquet"), configs)
    val reader = AvroParquetReader.builder[GenericRecord](inputFile).build()

    val records = new ListBuffer[Map[String, String]]()

    var i = Option(reader.read)
    while (i.isDefined) {
      val featureHashMap = i.get.get("domainId").asInstanceOf[java.util.HashMap[Utf8, Utf8]]
      records += featureHashMap
        .asScala
        .map(i => {
          (i._1.toString, i._2.toString)
        })
        .toMap

      i = Option(reader.read)
    }

    records
  }

我尝试将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值。

相关问题