有一个场景,我们从 Teradata(SRC) 获取输入数据并将其加载到 Spark Hive 仓库中。我们有一个时间戳列和时区,如下所示,并且希望在读取 Spark SQL 并将其存储在数据帧中以进行进一步的 ETL 计算时看到相同的内容。主要列应该仅是时间戳数据类型。
# Input table column values(printing only one column from the Teradata table):
# 9999.12.31 10:15:00+03:00
# 9999.12.31 10:15:00+05:30
# 9999.12.31 10:15:00+03:00
df = spark.sql("""select to_timestamp('9999.12.31 10:15:00+03:00',
"yyyy.MM.dd HH:mm:ss")""")
# 9999.12.31 10:15:00
# 9999.12.31 10:15:00
# 9999.12.31 10:15:00
现在,我们需要打印该值以及时区。但我们需要在输出处理中导出与输入列中相同的内容。
试试这个:
spark.conf.set("spark.sql.session.timeZone", "UTC+03")
df = spark.sql(
"""select date_format(cast(to_timestamp('9999.12.31 10:15:00+03:00', 'yyyy.MM.dd HH:mm:ssVV') as timestamp), 'yyyy.MM.dd HH:mm:ssxxx') as ts_with_offset"""
)
df.show(truncate=False)
Output:
+-------------------------+-------------------------+
|input_column |ts_with_offset |
+-------------------------+-------------------------+
|9999.12.31 10:15:00+03:00|9999.12.31 10:15:00+03:00|
|9999.12.31 10:15:00+05:30|9999.12.31 07:45:00+03:00|
|9999.12.31 10:15:00+03:00|9999.12.31 10:15:00+03:00|
+-------------------------+-------------------------+
有一件事是 - 它仅保留
+03:00
偏移量并调整此偏移量的其他时区。要按原样打印其他胶印,您必须想出一个解决方法。也许是一个以某种方式动态设置偏移值的 UDF。