【发布时间】:2021-10-22 10:40:08
【问题描述】:
我在 Scala 代码 (Scala 2.13) 中有一个这样的函数,可与 Spark 一起使用
def getDataset[T <: Product: TypeTag](name:String): Dataset[T] = {
import spark.implicits._
val ds = spark.read.parquet(BASE_PATH + "/" + name).as[T]
ds.createOrReplaceTempView(name)
ds
}
现在我想转一个Seq的案例类,并为每个类调用这个函数:
case class CLASS1(...)
case class CLASS2(...)
case class CLASS3(...)
Seq(CLASS1, CLASS2, CLASS3, ....).foreach {
c => getDataset[c??](name=c???)
}
我很难弄清楚确切的语法;案例类名称的符号,由foreach 中的变量c 表示,似乎表示apply 方法的类型(() => Product)。我真正想要的是用作类型参数的案例类的type,以及案例类的name。
感觉我应该能够做到这一点 - 我在这里错过了什么?
更新看起来可以通过TypeTag在运行时获取类型参数中使用的类型的名称。
我正在融合的解决方案是这样的:
def getDataset[T <: Product: TypeTag]: Dataset[T] = {
import spark.implicits._
val name = typeTag[T].tpe.typeSymbol.name.toString
val ds = spark.read.parquet(BASE_PATH + "/" + name).as[T]
ds.createOrReplaceTempView(name)
ds
}
然后像Seq(getDataset[CLASS1], getDataset[CLASS2], ...)
不是我所希望的,但至少我可以剪掉类名和字符串的复制粘贴。
【问题讨论】:
-
你是如何在 Scala 2 中构建这个
Seq的? Scala 2 中的所有集合都是同质的。你不能有一个元素序列,其中每个元素都是不同类的实例 -
这可能是
Seq[Class[_]]吗? -
啊,好吧,所以它们都是同一类型,只是对于任何
A,seq 可能是Seq[A]。写class1, class2, class3有点混乱。c.getClass出于某种原因在这里不够用吗? -
不,这是案例类名,但显然案例类名的符号被解释为应用函数而不是类,所以它是同质的
Seq[() => Product] -
@wrschneider In
Seq(Class1, Class2, Class3)Class1,Class2,Class3是案例类的伴随对象。
标签: scala apache-spark