从 DataFrame 到 Array 的不同值

Ian*_*Ian 4 scala apache-spark

DataFrame我试图将 a (称为:)的单列的不同值df放入与该列的数据类型匹配的数组中。这是我尝试过的,但它不起作用:

def distinctValues[T: ClassTag](column: String): Array[T] = {
      df.select(df(column)).distinct.map {
        case Row(s: T) => s
      }.collect
    }
Run Code Online (Sandbox Code Playgroud)

该方法位于隐式类内部,因此调用df.distinctValues("some_col")给了我:

scala.MatchError: [ABCD] (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema)
Run Code Online (Sandbox Code Playgroud)

有没有一种优雅的方式来实现我想要的,而且类型安全?

我使用的是 Spark 1.4.1。

Paw*_*nko 5

问题是您使用的是模式匹配而不是getAs方法:

implicit final class DataFrameOps(val df: DataFrame) {
  def distinctValues[T: ClassTag](column: String): Array[T] = {
     df.select(column).distinct().map(_.getAs[T](column)).collect()
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

val ageArray: Array[Int] = df.distinctValues("age")
or
val ageArray = df.distinctValues[Int]("age")
Run Code Online (Sandbox Code Playgroud)