Как передать столбец данных в функцию scala - PullRequest
0 голосов
/ 25 февраля 2020

Я написал функцию scala, которая будет преобразовывать время (ЧЧ: мм: сс.ССС) в секунды. Сначала он будет игнорировать миллисекунды и займет только (ЧЧ: мм: сс) и преобразуется в секунды (целые). Работает нормально при тестировании в spark-shell.

def hoursToSeconds(a: Any): Int = {
 val sec = a.toString.split('.')
 val fields = sec(0).split(':')
 val creationSeconds = fields(0).toInt*3600 + fields(1).toInt*60 + fields(2).toInt
 return creationSeconds
}

print(hoursToSeconds("03:51:21.2550000"))
13881

Мне нужно было бы передать эту функцию в один из столбцов данных (выполняется), который я пытался с помощью метода withColumn, но получаю ошибку Несоответствие типов, ожидаемое: столбец, фактическая строка . Буду признателен за любую помощь, есть ли способ передать функцию scala в udf и затем использовать udf в df.withColumn.

df.printSchema
root
 |-- vin: string (nullable = true)
 |-- BeginOfDay: string (nullable = true)
 |-- Timezone: string (nullable = true)
 |-- Version: timestamp (nullable = true)
 |-- Running: string (nullable = true)
 |-- Idling: string (nullable = true)
 |-- Stopped: string (nullable = true)
 |-- dlLoadDate: string (nullable = false)

образец работает значения столбца.

enter image description here

df.withColumn("running", hoursToSeconds(df("Running")

1 Ответ

1 голос
/ 25 февраля 2020

Вы можете создать udf для функции hoursToSeconds, используя следующий синтаксис:

val hoursToSecUdf = udf(hoursToSeconds _)

Для дальнейшего использования в определенном столбце можно использовать следующий синтаксис:

df.withColumn("TimeInSeconds",hoursToSecUdf(col("running")))
...