У меня есть примерный кадр данных следующим образом:
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")))
?