我有一个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
}
}