Hive毫秒epoch时间戳转换及Hive与Snowflake语法兼容方案
解答
Hive毫秒级时间戳原生支持说明
Hive 2.2+ 版本内置了无需秒值换算的毫秒级时间戳处理能力,不需要通过unix_timestamp()*1000的方式做换算:
- 获取当前epoch毫秒时间戳:直接调用
to_epoch_milli(current_timestamp()),返回BIGINT类型的毫秒级时间戳 - 毫秒时间戳转日期类型:调用
timestamp_millis(毫秒值BIGINT字段),直接将毫秒时间戳转换为TIMESTAMP类型,无精度损失
低版本Hive可通过cast(current_timestamp() as double)*1000取整得到毫秒时间戳,同样不依赖秒级时间戳的乘算逻辑。
跨Hive、Snowflake兼容查询适配方案
现有查询逻辑unix_timestamp('20220714','yyyyMMdd')*1000 > SomeColumn不需要做任何修改,仅需在Snowflake侧完成两项配置即可解决类型报错,且逻辑与Hive完全对齐:
- 保留已创建的
UNIX_TIMESTAMP自定义函数,现有返回秒级epoch值的实现与Hive原生函数行为一致,无需调整 - 创建TIMESTAMP到BIGINT的隐式类型转换,对齐Hive中BIGINT毫秒值与TIMESTAMP比较时的自动转换规则,执行以下SQL即可:
CREATE CAST (TIMESTAMP AS BIGINT) WITH FUNCTION DATE_PART(EPOCH_MILLISECOND, TIMESTAMP_VALUE) AS IMPLICIT;
配置生效后,Snowflake执行比较运算时,会自动将右侧TIMESTAMP类型的字段转换为毫秒级BIGINT值,两侧类型一致不会触发报错,时间比较逻辑与Hive侧完全等价,不存在精度偏差。
内容的提问来源于stack exchange,提问作者Sella
相关产品推荐
相关产品推荐

