Метка времени преобразования Spark Scala - PullRequest
0 голосов
/ 15 мая 2019

У меня есть UDF в pyspark, как показано ниже для преобразования строки в метку времени

@udf(returnType=TimestampType())
def to_timestamp(dt):
    return parse(dt)

TimestampType - из pyspark.sql.types import TimestampType

Я хочу преобразовать его в Scala (spark), я пытаюсь что-то вроде ниже, но он не выбирает аргументы

def toTimestampFormat(dt: String): TimestampType= {
    return unix_timestamp(dt, "yyyyMMdd'T'HHmmss:SSSSSS").cast(TimestampType)
}

Я что-то упустил в этом?

1 Ответ

1 голос
/ 15 мая 2019

Вам не нужно создавать 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)
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...