从Spark DataFrame我需要将epoch / unix时间戳列(例如1509102527 = GMT:2017年10月27日星期五11:08:47)转换为本地化时间戳,以获取特定时区的本地小时
是否有Spark SQL函数可以获取unix时间戳并返回本地化的java.sql.Timestamp?
我已经尝试使用from_unixtime
函数,但它会根据运行代码的计算机的默认系统时区返回本地化时间戳。到目前为止,我找到的唯一解决方案是将时间戳转换回UTC,然后从UTC转换为目标时区。
这是一个与解决方法一起使用的单元测试,但应该有更好的方法来实现它。
test("timezone localization should not change effective unix timestamp") {
import org.apache.spark.sql.functions._
val df = Seq(1509102527)
.toDF("unix_timestamp")
.withColumn("machine_localised_timestamp", from_unixtime('unix_timestamp))
.withColumn("utc_timestamp", to_utc_timestamp('machine_localised_timestamp, TimeZone.getDefault().getID()))
.withColumn("local_time", from_utc_timestamp('utc_timestamp, "Europe/Amsterdam"))
.withColumn("local_hour", hour('local_time))
.withColumn("reverted_unix_timestamp", unix_timestamp('local_time))
df.show(false)
val row = df.collect()(0)
row(row.fieldIndex("unix_timestamp")) shouldBe 1509102527
row(row.fieldIndex("reverted_unix_timestamp")) shouldBe 1509102527
row(row.fieldIndex("local_hour")) shouldBe 13
}