将带有时区列的日期字符串转换为Spark Scala中的时间戳

时间:2019-06-18 12:30:42

标签: scala apache-spark apache-spark-sql databricks

我需要将字符串(带时区的日期)列转换为Timestamp。转换后的时间戳列应具有与字符串字段相同的值。

有一个具有日期和时间偏移量的字符串字段,我尝试将其转换为时间戳数据类型,实际上将其转换为UTC格式,但我希望偏移量与时间戳数据类型具有相同的日期和时间

Seq("2019-02-05T18:59:11.0874121+05:30").toDF("date_str")
.select($"date_str")
.withColumn("date_timestamp",$"date_str".cast("timestamp"))
.show(false)

我希望date_timestamp列应具有"2019-02-05T18:59:11.0874121+05:30",但实际上它已转换为UTC格式"2019-02-05T13:29:11.087+0000"

1 个答案:

答案 0 :(得分:1)

我使用udf将字符串转换为时间戳,而无需进行任何更改。

import java.text.SimpleDateFormat
import java.sql.Timestamp

val convertToTimestamp= (logTimestamp: String) => {
  try {
    // change the date format as needed
    val sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss','SSS")
    val theDate = sdf.parse(logTimestamp)
    new Timestamp(theDate.getTime)
  } catch {
    case _: Exception => null
  }
}

//register for sql
sqlContext.udf.register("convertToTimestamp", convertToTimestamp)
//register for scala 
def convertToTimestampUDF = udf(convertToTimestamp)

val newDfWithTimeStamp = oldDfWithString.select(convertToTimestampUDF($"date_timestamp ").alias("date_timestamp "))