scala - 在类型化数据集上进行模式匹配
问题描述
我正在尝试根据火花数据集的类型应用不同类型的逻辑。根据传递给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
}
}
}
解决方案
尝试这个-
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
测试用例-
@Test
def test62262873(): Unit = {
val workers: Dataset[Worker] = Seq(
Worker("Bob", id = 1, skills = Array("communication", "teamwork")),
Worker("Sam", id = 2, skills = Array("self-motivation"))
).toDS
import scala.reflect.runtime.universe._
def doWork[T : TypeTag](persons: Dataset[T]): Unit = {
typeOf[T] match {
case t if t =:= typeOf[Worker] => println("I'm worker")
persons.as[Worker].filter(_.id == 2).show(false)
case t if t =:= typeOf[Customer] => println("I'm Customer")
persons.as[Customer].filter(_.name.contains("B")).show(false)
}
}
doWork(workers)
/**
* I'm worker
* +----+---+-----------------+
* |name|id |skills |
* +----+---+-----------------+
* |Sam |2 |[self-motivation]|
* +----+---+-----------------+
*/
}
推荐阅读
- python - 实例化后对象仍然没有?
- d3.js - 反应中的 D3 正在创建多个值更新图
- python - 如何将 Jupyter 中的数据框导出为 csv 文件
- python - 图例中显示的阴影颜色与我在图中的不同
- gremlin - 创建顶点后添加失败的边 (Neptune InternalFailureException)
- java - java.lang.NoSuchMethodErrror:'com.mongodb.connection.ConnectionPoolSettings$Builder
- regex - Apache 子域基础重定向
- laravel-6.2 - 我可以从 PHRETS 获得实时通知吗?
- node.js - source.on 不是函数
- amazon-web-services - 如何允许或阻止 aws iam 用户运行 sendCommand?