Spark SQL和时区 - 如何将unix时间戳转换为本地化时间戳

时间:2017-10-27 11:22:39

标签: scala apache-spark timezone

从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
}

0 个答案:

没有答案