【问题标题】:Scala Spark : trying to avoid type erasure when using overload [duplicate]Scala Spark:在使用重载时尝试避免类型擦除[重复]
【发布时间】:2017-05-19 10:17:40
【问题描述】:

我对 Scala/Spark 比较陌生

我正在尝试根据类类型将一个函数重载到 DStream 中

def persist(service1DStream: DStream[Service1]): Unit = {...}
def persist(service2DStream: DStream[Service2]): Unit = {...}

我收到编译错误:

persist(_root_.org.apache.spark.streaming.dstream.DStream) is already defined in the scope

似乎是由于类型擦除。 如何让编译器识别DStream[Service1]DStream[Service2]不同

谢谢

【问题讨论】:

  • 你可以使用scala模式匹配:def persist(serviceDStream: DStream[_]) = { serviceDStream match { case DStream[Service1] => doStuffForService1 }}

标签: scala apache-spark overloading type-erasure dstream


【解决方案1】:
def persist(serviceDStream: DStream[Any]): Unit = serviceDStream match {
case _: DStream[Service1] => println("it is a Service1")
case _: DStream[Service2] => println("it is a Service2")    
case _ => println("who knows")     
}

改进的解决方案 re runtime type erasure 使用 shapeless 更多信息 shapeless-guide:

import org.apache.spark.sql.SparkSession
import org.apache.spark.streaming.dstream.DStream
import shapeless.TypeCase

object Test {

 def main(args: Array[String]): Unit = {

val spark = SparkSession
  .builder
  .getOrCreate()

case class Service1 (a: String)
case class Service2 (a: Int)

val Service1Typed = TypeCase[DStream[Service1]]
val Service2Typed    = TypeCase[DStream[Service2]]

def persist(serviceDStream: DStream[Any]): Unit = serviceDStream match {

  case Service1Typed => println("it is a Service1")
  case Service2Typed => println("it is a Service2")
  case _ => println("who knows")
}

}

}

您也可以使用import scala.reflect.ClassTag 了解更多信息:ClassTag example

【讨论】:

  • 同样的问题 @karol on-variable type argument Service1 in type pattern org.apache.spark.streaming.dstream.DStream[Service1] is unchecked since it is eliminated by erasure [warn] case _ :DStream[Service1] => persistService1 _ 在 Scala 中,泛型在运行时被删除,因此 DStream[Service1] 和 DStream[Service2] 的类型实际上是相同的
  • @Fares,确实你是对的,看看 shapeless 或 ClassTag 来克服它。我更新了我的答案。
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2018-02-10
  • 2012-08-12
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多