scala多态函数

m2xkgtsf  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(388)

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

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

pbgvytdp

pbgvytdp1#

下面的代码编译(隐式 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
    }
}

相关问题