Вам не нужно создавать UDF для приведения строки в метку времени, вам просто нужно использовать функцию unix_timestamp
из Spark SQL, вызвав метод with_column
:
dataframe.withColumn("timestamp", unix_timestamp($"date", "yyyyMMdd'T'HHmmss:SSSSSS"))
Первый аргумент - это столбец, в котором находится дата в строковом формате. Второй формат этой строки.
Не забудьте импортировать функцию unix_timestamp
и последствия Spark для использования оператора $
:
import org.apache.spark.sql.functions.unix_timestamp
import spark.implicits._
Надеюсь, это поможет!
EDIT
Если вы уверены, что хотите выполнить эту операцию в UDF, то вы не можете использовать unix_timestamp
внутри него, потому что он должен получить объект столбца Spark, а когда вы определяете UDF, вы не ' Вместо этого вы работаете с фактическим значением этого столбца. Это причина, почему
в вашем коде unix_timestamp
не выбирает аргументы . Кроме того, функция, которую вы создаете для определения UDF, должна возвращать собственный тип данных Scala, а не тип данных столбца Spark, поэтому возвращать TimestampType
в такой функции не имеет смысла.
Чтобы преобразовать строку в метку времени в UDF, вам нужна функция, которая принимает строку и возвращает объект Long. В этом примере я определяю UDF, который вам нужен, используя библиотеку Joda-Time Scala:
val toTimestampFormat = udf((dt: String) => {
val formatter = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss")
formatter.parseDateTime(dt).getMillis
})
Наконец, вот как вы используете этот UDF:
dataframe.withColumn("timestamp", toTimestampFormat(col("date")))
РЕДАКТИРОВАТЬ 2
Если вы хотите, чтобы тип данных столбца был TimestampType
, функция внутри вашей UDF должна вернуть объект java.sql.Timestamp
:
val toTimestampFormat = udf((dt: String) => {
val formatter = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss")
new Timestamp(formatter.parseDateTime(dt).getMillis)
})