我需要将字符串(带时区的日期)列转换为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"
。
答案 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 "))