说我有两张桌子
External table - etable
Internal table - itable
我的etable根据日期进行分区。
现在每天从etable的数据填充我的itable我有Hed Query的hue工作流和协调器,如下所示:
ALTER TABLE etable ADD IF NOT EXISTS PARTITION (date = '${date}') LOCATION 'path/date=${date}';
INSERT OVERWRITE TABLE itable partition(date = '${date}') SELECT * FROM etable WHERE date = '${date}';
现在假设我每天都要更新过去n
天的数据,我该怎么做?
E.g。
让我们n = 2
,如果协调员计划今天运行,即2018-01-20
(yyyy-MM-dd),那么它应该更新过去2
天的数据。因此,查询应更新2018-01-20
和2018-01-19
的数据。所以基本上我需要用不同的日期运行上面的查询两次。
有没有办法循环这个查询n
次并使用循环变量,因为我可以使用date_sub()
在循环的每次迭代中获得不同的日期。还是有更好的方法吗?
谢谢。
答案 0 :(得分:2)
你应该可以做到
INSERT OVERWRITE TABLE itable partition(`date`)
SELECT * FROM etable
WHERE `date` BETWEEN datesub('${date}', ${n}) AND '${date}'
无论如何,Hive没有循环。由于您正在尝试动态构建查询,Hue和Oozie无法做到这一点
执行此操作的方式需要使用beeline -u jdbc:hive2://server:10000 --hivevar date="value" -f script.sql
或者,只要可以与Hive通信,您就可以使用Python,Java或您熟悉的任何内容来编写循环。
然后,您可以使用Oozie
安排该脚本/代码