我尝试根据spark数据集的类型应用不同类型的逻辑。取决于传递给的case类的类型 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
}
}
}
4条答案
按热度按时间wooyq4lh1#
使用case类可以进行模式匹配。case类是scala的方法,它允许在对象上进行模式匹配,而不需要大量的样板文件。通常,您所需要做的就是为每个希望模式匹配的类添加一个case关键字。
例如:
以你为例,我会试试这个
mbskvtky2#
修改方法以接受
[T <:parent]
然后从中提取bean类名Dataset.javaRdd
如下所示llew8vvj3#
试试这个-
测试用例-
cngwdvgl4#
我找到了一个解决我自己的问题,但我想给予信贷萨默什瓦尔甘蓝的答案,因为它做什么是要求。在这个版本中,我使用隐式来创建转换器,我可以根据需要进行扩展。