带计算的查询分区,避免全表扫描

cs7cruho  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(459)

我是一名分析师,试图构建一个查询,从hadoop中的表中提取过去7天的数据。表本身是按日期划分的。
当我用硬编码的日期测试查询时,一切都按预期进行。但是,当我编写它来根据今天的时间戳进行计算时,它正在进行全表扫描,我不得不终止该作业。
示例查询:

SELECT * FROM target_table 
WHERE date  >= DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'),7);

如果您能给我一些建议,告诉我如何在避免全表扫描的同时修改查询,我将不胜感激。
谢谢您!

jvidinwx

jvidinwx1#

我不确定我是否有一个优雅的解决方案,但是因为我使用oozie来协调工作流,所以我从oozie传递开始日期和结束日期。在没有oozie的情况下,我可以使用bash来计算适当的日期,并将它们作为参数传入。
分区过滤器一直都有这个问题,所以我找到了一个解决方法。

dddzy1tm

dddzy1tm2#

我有一些变通办法,它适用于我,如果没有日期超过30/60/90/120。
查询式

(((unix_timestamp(date,'yyyy-MM-dd')) >= (unix_timestamp(date_sub(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd') ,${sub_days}),'yyyy-MM-dd'))) and((unix_timestamp(date,'yyyy-MM-dd')) <= (unix_timestamp(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'),'yyyy-MM-dd'))))

sub_days=通过参数,这里可能是7

相关问题