能否将BIGINT类型时间戳列的日期部分设置为DISTKEY?
问题解答:无法将时间戳日期部分设为DISTKEY的原因及解决方法
Redshift的DISTKEY只能指定表中已存在的物理列,不能直接使用函数表达式(比如substring(time,0,10))来设置,这就是你的ALTER语句被拒绝的核心原因。要实现将日期部分作为DISTKEY的需求,需要通过以下步骤操作:
解决方案步骤
步骤1:添加持久化的日期列
首先需要基于你的BIGINT时间戳列,生成一个物理存储的日期列。如果是毫秒级时间戳,执行以下SQL:ALTER TABLE your_table ADD COLUMN date_part DATE; UPDATE your_table SET date_part = TO_DATE(TO_CHAR(TO_TIMESTAMP(time/1000), 'YYYY-MM-DD'), 'YYYY-MM-DD');如果是秒级时间戳,去掉
/1000即可:UPDATE your_table SET date_part = TO_DATE(TO_CHAR(TO_TIMESTAMP(time), 'YYYY-MM-DD'), 'YYYY-MM-DD');若是新建表,可以直接定义存储的计算列:
CREATE TABLE your_table ( time BIGINT, date_part DATE GENERATED ALWAYS AS (TO_DATE(TO_CHAR(TO_TIMESTAMP(time/1000), 'YYYY-MM-DD'), 'YYYY-MM-DD')) STORED, -- 其他列定义... ) DISTSTYLE KEY DISTKEY(date_part);步骤2:修改DISTKEY为新增日期列
当日期列数据填充完成后,即可修改表的DISTKEY:ALTER TABLE your_table ALTER DISTKEY date_part;⚠️ 注意:修改DISTKEY会触发全表数据重分布,数据量较大时会占用大量集群资源,建议在业务低峰期执行。
特殊场景说明
如果是Parquet外部表,Redshift不支持直接添加计算列,此时需要创建一个内部表或物化视图,将日期列作为物理列存储后,再设置为DISTKEY。
内容的提问来源于stack exchange,提问作者carfield
相关产品推荐
相关产品推荐

