【发布时间】:2020-09-27 11:11:00
【问题描述】:
我正在尝试根据 spark 数据集的类型应用不同类型的逻辑。
根据传递给doWork(Customer 或Worker)的案例类的类型,我必须应用不同类型的聚合。
我该怎么做?
import org.apache.spark.sql.{Dataset, SparkSession}
object SparkSql extends App {
import spark.implicits._
val spark = SparkSession
.builder()
.appName("Simple app")
.config("spark.master", "local")
.getOrCreate()
sealed trait Person {
def name: String
}
final case class Customer(override val name: String, email: String) extends Person
final case class Worker(override val name: String, id: Int, skills: Array[String]) extends Person
val workers: Dataset[Worker] = Seq(
Worker("Bob", id = 1, skills = Array("communication", "teamwork")),
Worker("Sam", id = 1, skills = Array("self-motivation"))
).toDS
def doWork(persons: Dataset[Person]): Unit = {
persons match {
case ... // Dataset[Customer] ... do something
case ... // Dataset[Worker] ... do something else
}
}
}
【问题讨论】:
-
你不能这样做,因为类型擦除。数据集的类型是静态的还是动态的?另外,你想对所有数据集还是对每个元素做点什么?
-
您不能直接对泛型进行模式匹配,因为它们在运行时不存在。但是,可能有出路,详情请参阅此答案:stackoverflow.com/questions/12218641/…
-
查询-你如何将
Dataset[Worker]传递给def doWork(persons: Dataset[Person]): Unit = {?
标签: scala apache-spark dataset pattern-matching