如何在写入 Snowflake 时使用 Spark/PySpark 将 timestamp_ntz 类型转换为 CST 格式

How to typecast timestamp_ntz to CST format using Spark/PySpark while writing to Snowflake

众所周知,Snowflake 中有 3 个时间戳,

  1. TIMESTAMP_NTZ
  2. TIMESTAMP_LTZ
  3. TIMESTAMP_TZ

因此在将时间戳写入雪花 table 时,默认情况下采用 TIMESTAMP_NTZ。 snowflake 如何在写入 snowflake table 时采用 CST 时区的时间戳?

首先,重要的是要知道您的 account/session:

的默认时区是什么
SHOW PARAMETERS LIKE 'TIMEZONE';

然后将会话的默认设置更改为 CST

ALTER SESSION SET TIMEZONE = 'America/Chicago';

此后 current_timestamp 的任何选择都将在正确的时区提供数据

SELECT CURRENT_TIMESTAMP;

这是一篇很棒的文章,可供参考: Snowflake timestamp datatype ref

假设您可以控制 table 中的精确列类型,我发现 TIMESTAMP_TZ 是您定义 table 的方式。这是我所做的一切的工作示例:

alter session set timezone = 'America/Los_Angeles';
create or replace table ts_test(rn number, ts timestamp_tz);

insert into ts_test values(1, current_timestamp());
insert into ts_test values(2, '2019-12-10 07:50:00 -06:00');
insert into ts_test values(3, CONVERT_TIMEZONE('America/Chicago', CURRENT_TIMESTAMP()));

select * from ts_test;

如果时间戳是在代码中生成的,那么请确保在插入时包含 UTC 偏移量 (rn 2)。如果您使用的是 LA 的 current_timestamp(),请确保您转换为 CST (rn 3)。

如果正在生成 table 并且您不控制时区默认值,则首先发出此命令:

alter session set timestamp_type_mapping = timestamp_tz;