имена столбцов искры udf

Мне нужно указать последовательность столбцов. Если я передаю две строки, все работает нормально

val cols = array("predicted1", "predicted2")

но если я передаю последовательность или массив, я получаю сообщение об ошибке:

 val cols = array(Seq("predicted1", "predicted2"))

Не могли бы вы мне помочь? Большое спасибо!


person Simon Pastuch    schedule 12.07.2016    source источник


Ответы (3)


Сигнатура функции def array(colName: String, colNames: String*): Column, что означает, что она принимает одну строку, а затем одну или несколько строк. Если вы хотите использовать последовательность, сделайте это так:

array("predicted1", Seq("predicted2"):_*)

Из того, что я вижу, в коде есть несколько перегруженных версий этой функции, но ни одна из них не принимает Seq напрямую. Так что преобразование его в varargs, как описано, должно быть правильным решением.

person slouc    schedule 12.07.2016

Здесь у вас есть как минимум два варианта:

  1. Используя Seq[String]:

    val columns: Seq[String] = Seq("predicted1", "predicted2")
    
    array(columns.head, columns.tail: _*)
    
  2. Используя Seq[ColumnName]:

    val columns: Seq[ColumnName] = Seq($"predicted1", $"predicted2")
    
    array(columns: _*)
    
person Paweł Jurczenko    schedule 12.07.2016

Вы можете использовать форму массива Spark def array(cols: Column*): Column, где cols val определено без использования записи имени столбца $, то есть когда вы хотите иметь конкретный тип Seq[ColumnName], но создаваемый с использованием строк. Вот как это решить ...

import org.apache.spark.sql.ColumnName
import sqlContext.implicits._
import org.apache.spark.sql.functions._

val some_states: Seq[String] = Seq("state_AK","state_AL","state_AR","state_AZ")
val some_state_cols: Seq[ColumnName] = some_states.map(s => symbolToColumn(scala.Symbol(s)))

val some_array = array(some_state_cols: _*)

... используя метод Spark symbolToColumn.

или напрямую с конструктором ColumnName(s).

val some_array: Seq[ColumnName] = some_states.map(s => new ColumnName(s))
person warrens    schedule 06.05.2019