spark时间戳差异

js5cn81o  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(372)

我试图在spark中做一个时间戳差异,但它没有按预期工作。
下面是我如何尝试

import org.apache.spark.sql.functions.*
df = df.withColumn("TimeStampDiff", from_unixtime(unix_timestamp(df.col("TimeStampHigh"), "HH:mm:ss").minus(unix_timestamp(df.col("TimeStampLow"), "HH:mm:ss")),"HH:mm:ss"))

价值观

TimeStampHigh - 15:57:01
TimeStampLow - 00:11:57

它返回一个 10:45:04 预期输出- 15:45:04 我的另一个选择是使用java实现的udf。
任何提示都会有帮助。

qf9go6mv

qf9go6mv1#

那是因为 from_unixtime (我的重点):
将unix epoch(1970-01-01 00:00:00 utc)中的秒数转换为表示当前系统时区中该时刻的时间戳的字符串,格式为给定格式。
很明显,您的系统或jvm没有配置为使用utc时间。
您应该执行以下操作之一:
配置jvm以使用适当的时区( -Duser.timezone=UTC 两者皆适用 spark.executor.extraJavaOptions 以及 spark.driver.extraJavaOptions ).
spark.sql.session.timeZone 使用适当的时区。
例子:

scala> val df = Seq(("15:57:01", "00:11:57")).toDF("TimeStampHigh", "TimeStampLow")
df: org.apache.spark.sql.DataFrame = [TimeStampHigh: string, TimeStampLow: string]

scala> spark.conf.set("spark.sql.session.timeZone", "GMT-5")  // Equivalent to your current settings

scala> df.withColumn("TimeStampDiff", from_unixtime(unix_timestamp(df.col("TimeStampHigh"), "HH:mm:ss").minus(unix_timestamp(df.col("TimeStampLow"), "HH:mm:ss")),"HH:mm:ss")).show
+-------------+------------+-------------+
|TimeStampHigh|TimeStampLow|TimeStampDiff|
+-------------+------------+-------------+
|     15:57:01|    00:11:57|     10:45:04|
+-------------+------------+-------------+

scala> spark.conf.set("spark.sql.session.timeZone", "UTC")  // With UTC

scala> df.withColumn("TimeStampDiff", from_unixtime(unix_timestamp(df.col("TimeStampHigh"), "HH:mm:ss").minus(unix_timestamp(df.col("TimeStampLow"), "HH:mm:ss")),"HH:mm:ss")).show
+-------------+------------+-------------+
|TimeStampHigh|TimeStampLow|TimeStampDiff|
+-------------+------------+-------------+
|     15:57:01|    00:11:57|     15:45:04|
+-------------+------------+-------------+

相关问题