按类型触发选择列

Geo*_*ler 6 generics scala apache-spark

我想有一个功能,可以根据其数据类型动态选择spark Dataframe列。

到目前为止,我已经创建了:

object StructTypeHelpers {
  def selectColumnsByType[T <: DataType](schem: StructType):Seq[String] = {
    schem.filter(_.dataType.isInstanceOf[T]).map(_.name)
  }

}
Run Code Online (Sandbox Code Playgroud)

以便a StructTypeHelpers. selectColumnsByType[StringType](df.schema)应该起作用。但是,编译器警告我:

abstract type T is unchecked since it is eliminated by erasure
Run Code Online (Sandbox Code Playgroud)

尝试使用时:

import scala.reflect.ClassTag
def selectColumnsByType[T <: DataType: ClassTag](schem: StructType):Seq[String]
Run Code Online (Sandbox Code Playgroud)

它失败了

No ClassTag available for T
Run Code Online (Sandbox Code Playgroud)

如何在没有警告的情况下使它正常工作和编译?

fir*_*sni 6

想法是仅过滤具有所需类型的列,然后进行选择。

val df  =  Seq(
  (1, 2, "hello")
).toDF("id", "count", "name")

import org.apache.spark.sql.functions.col
def selectByType(colType: DataType, df: DataFrame) = {

  val cols = df.schema.toList
    .filter(x => x.dataType == colType)
    .map(c => col(c.name))
  df.select(cols:_*)

}
val res = selectByType(IntegerType, df)
Run Code Online (Sandbox Code Playgroud)

  • 为什么要使用asInstanceOf? (2认同)