Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark:在使用重载时尝试避免类型擦除_Scala_Apache Spark_Overloading_Type Erasure_Dstream - Fatal编程技术网

Scala Spark:在使用重载时尝试避免类型擦除

Scala Spark:在使用重载时尝试避免类型擦除,scala,apache-spark,overloading,type-erasure,dstream,Scala,Apache Spark,Overloading,Type Erasure,Dstream,我对Scala/Spark比较陌生 我试图根据类类型将一个函数重载到数据流中 def persist(service1DStream: DStream[Service1]): Unit = {...} def persist(service2DStream: DStream[Service2]): Unit = {...} 我得到一个编译错误: persist(_root.org.apache.spark.streaming.dstream.dstream)已在范围中定义 似乎是因为类型擦除。

我对Scala/Spark比较陌生

我试图根据类类型将一个函数重载到数据流中

def persist(service1DStream: DStream[Service1]): Unit = {...}
def persist(service2DStream: DStream[Service2]): Unit = {...}
我得到一个编译错误:

persist(_root.org.apache.spark.streaming.dstream.dstream)已在范围中定义

似乎是因为类型擦除。 如何使编译器认识到
DStream[Service1]
DStream[Service2]

多谢各位

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")     
}
改进的解决方案重新执行运行时类型擦除使用
无形状
更多信息:

}

}

您还可以使用
导入scala.reflect.ClassTag
更多信息:

改进的解决方案重新执行运行时类型擦除使用
无形状
更多信息:

}

}


您还可以使用
导入scala.reflect.ClassTag
更多信息:

您可以使用scala模式匹配:def persist(serviceDStream:DStream[)]={serviceDStream match{case DStream[Service1]=>dostufforservice1}}您可以使用scala模式匹配:def persist(serviceDStream:DStream[)]={serviceDStream match{case DStream[Service1]=>dostufforservice1}类型模式org.apache.spark.streaming.DStream.DStream[Service1]中变量类型参数Service1的相同问题@karol
未选中,因为它已通过擦除[warn]case:DStream[Service1]消除=>Scala泛型中的persistService1
在运行时被擦除,因此数据流[Service1]和数据流[Service2]的类型实际上是same@Fares,确实你是对的,看看Shapess或ClassTag来克服它。我更新了我的答案。类型模式org.apache.spark.streaming.dstream.dstream中变量类型参数Service1的相同问题@karol
。dstream[Service1]被取消选中,因为它被擦除[warn]case uqstream[Service1]消除=>Scala泛型中的persistService1
在运行时被擦除,因此数据流[Service1]和数据流[Service2]的类型实际上是same@Fares,确实你是对的,看看Shapess或ClassTag来克服它。我更新了我的答案。
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")
}