Создайте столбец искровых данных из пользовательской функции - PullRequest
0 голосов
/ 28 февраля 2019

Это должно быть тривиально - но я что-то упускаю:

import org.apache.spark.sql._
import org.apache.spark.functions._

val rand = new java.util.Random(42)
val zipUdf = udf( () => 10000 +  rand.nextInt(200))

val zdf = df.withColumn("postalCode",col(zipUdf))

Использование udf напрямую, по-видимому, некорректно:

found   : org.apache.spark.sql.expressions.UserDefinedFunction
 required: org.apache.spark.sql.Column

Какая магия требуется?

Обновление : я уже пробовал следующее:

 val zdf = df.withColumn("postalCode",zipUdf)

Реальная проблема в том, что zipUdf() не zipUdf

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вам не нужно оборачивать его в col ().Следующий код должен работать.

val zdf = df.withColumn("postalCode",zipUdf())
0 голосов
/ 28 февраля 2019

Работает без помех:

val someDF = Seq((0, "hello"), (1, "world")).toDF("id", "text")    
import org.apache.spark.sql.functions.udf   
val rand = new java.util.Random(42)
val zipUdf = udf(() => 10000 +  rand.nextInt(200))

someDF.withColumn("postalCode", zipUdf()).show

Вывод для кода выше:

+---+-----+----------+
| id| text|postalCode|
+---+-----+----------+
|  0|hello|     10130|
|  1|world|     10163|
+---+-----+----------+

Использование col() с withColumn является основной причиной сбоя.

0 голосов
/ 28 февраля 2019

Проблема (в виде ошибок) заключается в том, что zipUdf имеет тип UserDefinedFunction, тогда как функция withColumn ожидает Column.Вам нужно вызвать функцию zipUdf, чтобы получить обратно Column, т.е. использовать ():

val zdf = df.withColumn("postalCode", zipUdf())
...