Почему не работает вызов udf в dataframe select? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть примерный кадр данных следующим образом:

val df = Seq((Seq("abc", "cde"), 19, "red, abc"), (Seq("eefg", "efa", "efb"), 192, "efg, efz efz")).toDF("names", "age", "color")

И пользовательская функция следующим образом заменяет столбец «color» в df длиной строки:

def strLength(inputString: String): Long = inputString.size.toLong

Я сохраняю ссылку на udf для производительности следующим образом:

val strLengthUdf = udf(strLength _)

И когда я пытаюсь обработать udf во время выбора, он работает, если у меня нет других имен столбцов:

val x = df.select(strLengthUdf(df("color")))

scala> x.show
+----------+
|UDF(color)|
+----------+
|         8|
|        12|
+----------+

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

scala> val x = df.select("age", strLengthUdf(df("color")))
<console>:27: error: overloaded method value select with alternatives:
  [U1, U2](c1: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U1], c2: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U2])org.apache.spark.sql.Dataset[(U1, U2)] <and>
  (col: String,cols: String*)org.apache.spark.sql.DataFrame <and>
  (cols: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame
 cannot be applied to (String, org.apache.spark.sql.Column)
       val x = df.select("age", strLengthUdf(df("color")))
                  ^

Что мне здесь не хватает val x = df.select("age", strLengthUdf(df("color")))?

1 Ответ

0 голосов
/ 06 ноября 2018

Нельзя смешивать строки и столбцы в операторе выбора.

Это будет работать:

df.select(df("age"), strLengthUdf(df("color")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...