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