HiveSQL临时表日期计算报错:如何从today列减去73天?
解决临时表UPDATE操作不支持的问题
问题原因
你触发的错误是因为Hive默认的临时表不支持UPDATE这类ACID写操作,只有标记为ACID的表或者MapR JSON表才能执行更新操作。
解决方法
1. 插入时直接计算目标值(推荐)
没必要先插入数据再更新,直接在插入阶段就计算好rdf列的值,一步到位:
-- 创建临时表 CREATE TEMPORARY TABLE myvv(today date, rdf date, alert date); -- 插入时直接计算rdf INSERT INTO myvv(today, rdf) VALUES ('2019-07-20', date_sub('2019-07-20', 73));
验证结果:rdf列会直接得到2019-05-08。
2. 用子查询/CTE生成结果(适合复杂计算场景)
如果是基于已有数据集计算,甚至可以不用创建临时表,直接通过查询生成需要的结果:
WITH temp_data AS ( SELECT '2019-07-20' AS today ) SELECT today, date_sub(today, 73) AS rdf, alert -- 若alert列有数据,可在此处补充逻辑 FROM temp_data;
3. 创建支持ACID的临时表(需集群支持)
如果必须要先插入再更新,需要创建事务性临时表(Hive 3.0+版本支持),先配置事务参数再建表:
-- 开启事务相关配置(需集群允许) SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; SET hive.support.concurrency=true; -- 创建事务性临时表 CREATE TEMPORARY TABLE myvv( today date, rdf date, alert date ) STORED AS ORC TBLPROPERTIES ('transactional'='true'); -- 插入初始数据 INSERT INTO myvv(today) VALUES ('2019-07-20'); -- 执行更新操作 UPDATE myvv SET rdf = date_sub(today, 73);
总结
优先用前两种方法,不需要依赖集群的ACID配置,操作更轻量;第三种仅适用于必须更新临时表的特殊场景。
内容的提问来源于stack exchange,提问作者rotimi
相关产品推荐
相关产品推荐

