Spark 2.3 (Scala) - 将时间戳列从 UTC 转换为另一列中指定的时区
Spark 2.3 (Scala) - Convert a timestamp column from UTC to timezone specified in another column
我有一个包含如下数据的数据框:
+----------------------+------------+
| utc_timestamp | tz_locale |
+----------------------+------------+
|2021-07-16T10:00:00Z | US/Eastern |
|2021-07-19T15:00:00Z | US/Central |
+----------------------+------------+
我想根据 tz_locale
列中的值将时间戳从 UTC (TZ 0) 转换为当地时间:
+--------------------------+------------+
| utc_timestamp | tz_locale |
+--------------------------+------------+
|2021-07-16T06:00:00-04:00 | US/Eastern |
|2020-12-19T09:00:00-06:00 | US/Central |
+--------------------------+------------+
我试着这样写:
val new_df = df.withColumn("utc_timestamp", from_utc_timestamp(df.col("utc_timestamp"), df.col("tz_locale")))
看来 from_utc_timestamp
需要一个字符串常量作为第二个参数,因此它显然只能将整个列转换为同一时区。但是我需要根据该行中另一列的值动态转换每一行。
我认为这在较新版本的 Spark 中是可能的(from_utc_timestamp
被采用 (DataFrame.col, DataFrame.col)
的版本重载),但我使用的是 2.3,无法升级。这如何在 Spark 2.3 中完成?这似乎是一项相当常见的任务,但我无法弄清楚,也无法使用搜索找到任何内容。
对于 Spark 2.3 或更早版本,您可以通过 expr
:
使用类型约束较少的 SQL 表达式
df.withColumn("utc_timestamp", expr("from_utc_timestamp(utc_timestamp, tz_locale)")).show
+-------------------+----------+
| utc_timestamp| tz_locale|
+-------------------+----------+
|2021-07-15 23:00:00|US/Eastern|
|2021-07-19 03:00:00|US/Central|
+-------------------+----------+
我有一个包含如下数据的数据框:
+----------------------+------------+
| utc_timestamp | tz_locale |
+----------------------+------------+
|2021-07-16T10:00:00Z | US/Eastern |
|2021-07-19T15:00:00Z | US/Central |
+----------------------+------------+
我想根据 tz_locale
列中的值将时间戳从 UTC (TZ 0) 转换为当地时间:
+--------------------------+------------+
| utc_timestamp | tz_locale |
+--------------------------+------------+
|2021-07-16T06:00:00-04:00 | US/Eastern |
|2020-12-19T09:00:00-06:00 | US/Central |
+--------------------------+------------+
我试着这样写:
val new_df = df.withColumn("utc_timestamp", from_utc_timestamp(df.col("utc_timestamp"), df.col("tz_locale")))
看来 from_utc_timestamp
需要一个字符串常量作为第二个参数,因此它显然只能将整个列转换为同一时区。但是我需要根据该行中另一列的值动态转换每一行。
我认为这在较新版本的 Spark 中是可能的(from_utc_timestamp
被采用 (DataFrame.col, DataFrame.col)
的版本重载),但我使用的是 2.3,无法升级。这如何在 Spark 2.3 中完成?这似乎是一项相当常见的任务,但我无法弄清楚,也无法使用搜索找到任何内容。
对于 Spark 2.3 或更早版本,您可以通过 expr
:
df.withColumn("utc_timestamp", expr("from_utc_timestamp(utc_timestamp, tz_locale)")).show
+-------------------+----------+
| utc_timestamp| tz_locale|
+-------------------+----------+
|2021-07-15 23:00:00|US/Eastern|
|2021-07-19 03:00:00|US/Central|
+-------------------+----------+