【发布时间】:2019-07-13 20:20:11
【问题描述】:
我想要一个函数来按数据类型动态选择 spark Dataframe 列。
到目前为止,我已经创建了:
object StructTypeHelpers {
def selectColumnsByType[T <: DataType](schem: StructType):Seq[String] = {
schem.filter(_.dataType.isInstanceOf[T]).map(_.name)
}
}
这样StructTypeHelpers. selectColumnsByType[StringType](df.schema) 应该可以工作。但是,编译器警告我:
abstract type T is unchecked since it is eliminated by erasure
尝试使用时:
import scala.reflect.ClassTag
def selectColumnsByType[T <: DataType: ClassTag](schem: StructType):Seq[String]
失败了
No ClassTag available for T
如何在没有警告的情况下让它工作和编译?
【问题讨论】:
-
答案很明显,只需添加 TypeTag 或 ClassTag 等 docs.scala-lang.org/overviews/reflection/…,因为您没有在方法中提供有关类型 T 的信息。
-
但这不应该是:
T <: DataType: ClassTag吗?这失败了:No ClassTag available for T -
您必须隐式提供 TypeTag / ClassTag 信息,这有点痛苦,但效果很好
-
你的意思是:stackoverflow.com/questions/18136313/…?但它似乎还没有真正起作用。
-
不,这不是我的意思,像 def paramInfo[T](x: T)(implicit tag: TypeTag[T]),根据我的第一个链接,它真的应该工作,抱歉,应该把这个作为答案:)
标签: scala apache-spark generics