我有一个POJO对象,它是Map[String, AnyRef]
的包装(来自Java)。我想根据地图的键将AnyRef
的类型转换为特定的类型。最终目标是使POJO对象返回其自身作为Scala元组的表示形式,最终目标是将其转换为Spark Row。我该怎么办?
不起作用的东西:
case class PojoToTuple(c: JavaObject) extends JavaObject(c) {
//data: java.util.LinkedHashMap[String, AnyRef] is inherited
val fields: Seq[Tuple2[String, Class[_]]] = Seq(("name", classOf[String]),
("incorporation_date", classOf[java.sql.Date]),
... )
def getScalaRepresentation(): (String, Date, ...) = {
fields.map{case (s: String, t: Class[_]) => data.get(s).asInstanceOf[t]}
}
}
[ERROR] path\to\error: error: not found: type t
[ERROR] .map{case (s: String, t: Class[_]) => data.get(s).asInstanceOf[t]}
[ERROR] ^
我也尝试过
val fields: Seq[Tuple2[String, ???]] = Seq(("name", asInstanceOf[String]),
("incorporation_date", asInstanceOf[java.sql.Date]),
... )
但是asInstanceOf是抽象类Any
的成员,因此我不知道如何将其提取为任何类型的第一类对象。
有什么想法吗?
可行的替代方法是写
case class PojoToTuple(c: JavaObject) extends JavaObject(c) {
//data: java.util.LinkedHashMap[String, AnyRef] is inherited
val fields = Seq("name", "incorporation_date", ...)
def getSparkRepresentation(): (String, Date, ...) = {
(data.get("name").asInstanceOf[String],
data.get("incorporation_date").asInstanceOf[java.sql.Date],
...
)
我想获得一个版本,不必将字段名列表硬编码两次。我不喜欢这样做的另一个原因是,我想重载getSparkRepresentation()
函数以也接受字段名列表,以获取所有字段的子集。使用硬编码版本没有一个很好的方法。