我正在尝试读取字段domainId
和entityId
的拼花文件。
然而,当它试图将值放入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
值。