通过计算查询分区并避免全表扫描

时间:2015-02-13 01:46:02

标签: hadoop hql hadoop-partitioning

我是一名分析师,试图构建一个查询,从Hadoop中的表中提取最近7天的数据。表本身按日期分区。

当我使用硬编码日期测试我的查询时,一切都按预期工作。但是,当我根据今天的时间戳写它来计算时,它正在进行全表扫描,我不得不杀死这份工作。

示例查询:

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

我很欣赏一些建议,即如何在避免全表扫描的同时修改查询。

谢谢!

2 个答案:

答案 0 :(得分:0)

我不确定我有一个优雅的解决方案,但由于我使用Oozie进行工作流协调,我从Oozie传入start_date和end_date。在没有Oozie的情况下,我可能会使用bash来计算适当的日期并将其作为参数传递。

分区过滤器一直存在这个问题,所以我发现自己是一个解决方法。

答案 1 :(得分:0)

我有一些解决方法,如果Date的数量超过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