多态函数



我有一个Dataset[Edge],其中每条边都是从父实体到子实体的边。使用下面的函数,我想从parent_id映射到它的子实体。

子实体可以是不同类型的,例如(公司的(高级职员、(公司的的(中间人、(公司、高级职员或中间人的(地址

def mapParentIDtoEntity[T](edges: Dataset[Edge], entities: Dataset[T])(implicit tag: TypeTag[T]) = {
edges
.joinWith(
entities,
edges("child_id") ==== entities("id"),
"left"
)
.map(
case (edge: Edge, entity: T) => edge.parent_id -> entity
)
}

我的问题与类型擦除有关。我已经添加了(implicit tag: TypeTag[T]),以确保Spark能够对T进行编码,但我仍然有以下错误:

abstract type T in type pattern reflect.runtime.universe.TypeTag[T] (the underlying of tag.type) 
is unchecked since it is eliminated by erasure
case (edge: Edge, entity: T) => edge.parent_id -> entity

有人能解释一下为什么这种情况还会发生,以及我该如何解决吗?

以下代码编译(使用隐式Encoder[(Int, T)]而不是TypeTag[T](

import org.apache.spark.sql.{Dataset, Encoder}
case class Edge(parent_id: Int)
def mapParentIDtoEntity[T](edges: Dataset[Edge], entities: Dataset[T](implicit 
enc: Encoder[(Int, T)]
) = {
edges
.joinWith(
entities,
edges("child_id") === entities("id"),
"left"
)
.map {
case (edge: Edge, entity: T) => edge.parent_id -> entity
}
}

最新更新