将数据类型强制转换为HashMap错误:org.apache.avro.util.Utf8不能强制转换为java.uti



我正在尝试读取字段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更改为String(java.util.HashMap[String, String]),但仍然得到相同的错误。

我能做些什么让HashMap接受Utf8吗?

org.apache.avro.util。Utf8不能强制转换为java.util.HashMap

这意味着asInstanceOf调用不能将Utf8值转换为HashMap值,因为类型不兼容。HashMap的类型参数是什么并不重要,它永远不会是Utf8。即使您修复了这个特定的错误,使用asInstanceOf也总是有这种失败的风险。

一个更好的解决方案是使用match而不是asInstanceOf。一个case可以匹配您期望的类型,并且可以安全地将类型缩小到您想要的类型。第二个case可以处理其他类型,并根据需要提供默认值或错误值。

在这种情况下,domainId字段似乎只是一个Utf8字符串,所以你可能需要进一步处理它来创建HashMap,或者修改你的逻辑来处理Utf8值。

相关内容

  • 没有找到相关文章

最新更新