От колонны к массиву Scala Spark - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь применить функцию к Column в Scala, но я сталкиваюсь с некоторыми трудностями.

Есть эта ошибка

found   : org.apache.spark.sql.Column
required: Array[Double]

Есть ли способ конвертировать?от Column до Array?Спасибо

Обновление:

Большое спасибо за ваш ответ, я думаю, что все ближе к тому, чего я пытаюсь достичь.Я дам вам немного больше контекста:

Вот код:

object Targa_Indicators_Full {

  def get_quantile (variable: Array[Double], perc:Double) : Double = {
  val sorted_vec:Array[Double]=variable.sorted
  val pos:Double= Math.round(perc*variable.length)-1
  val quant:Double=sorted_vec(pos.toInt)
  quant
  }

def main(args: Array[String]): Unit = {

 val get_quantileUDF = udf(get_quantile _)

 val plate_speed = 
 trips_df.groupBy($"plate").agg(sum($"time_elapsed").alias("time"),sum($"space").alias("distance"),
 stddev_samp($"distance"/$"time_elapsed").alias("sd_speed"),
 get_quantileUDF($"distance"/$"time_elapsed",.75).alias("Quant_speed")).
 withColumn("speed", $"distance" / $"time")

}

Теперь я получаю эту ошибку:

type mismatch;
[error]  found   : Double(0.75)
[error]  required: org.apache.spark.sql.Column
[error]  get_quantileUDF($"distanza"/$"tempo_intermedio",.75).alias("IQR_speed")
                                                         ^
[error] one error found

Что я могу сделать?Спасибо.

1 Ответ

0 голосов
/ 03 октября 2018

Вы не можете напрямую применить функцию к столбцу Dataframe.Вы должны преобразовать свою существующую функцию в UDF.Spark предоставляет пользователю возможность определять пользовательские пользовательские функции (UDF).

Например: у вас есть кадр данных со столбцом массива

scala> val df=sc.parallelize((1 to 100).toList.grouped(5).toList).toDF("value")
df: org.apache.spark.sql.DataFrame = [value: array<int>]

Вы определили функцию для применения к столбцу типа массива

def convert( arr:Seq[Int] ) : String = {
  arr.mkString(",")
}

Вы должны преобразовать этов udf перед применением в столбце

val convertUDF = udf(convert _)

А затем вы можете применить свою функцию:

df.withColumn("new_col", convertUDF(col("value")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...