sql—为什么不对此查询执行分区消除?

im9ewurl  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(245)

我有一个Hive表,它按年、月、日和小时划分。我需要对它运行一个查询来获取过去7天的数据。这是在 Hive 0.14.0.2.2.4.2-2 . 我的查询当前如下所示:

SELECT COUNT(column_name) from table_name 
where year >= year(date_sub(from_unixtime(unix_timestamp()), 7)) 
AND month >= month(date_sub(from_unixtime(unix_timestamp()), 7)) 
AND day >= day(date_sub(from_unixtime(unix_timestamp()), 7));

这需要很长时间。当我用实际数字代替上面的数字时,我会说:

SELECT COUNT(column_name) from table_name 
where year >= 2017
AND month >= 2
AND day >= 13

几分钟后就结束了。有没有办法改变上面的脚本,使它实际上只包含查询中的数字而不是函数?
我试过用 set 比如:

set yearLimit = year(date_sub(from_unixtime(unix_timestamp()), 7));

SELECT COUNT(column_name) from table_name 
where year >= ${hiveconf:yearLimit}
AND month >= month(date_sub(from_unixtime(unix_timestamp()), 7)) 
AND day >= day(date_sub(from_unixtime(unix_timestamp()), 7));

但这并不能解决问题。

vlurs2pr

vlurs2pr1#

解决方案

select      count (column_name) 

from        table_name 

where       year  >= year  (date_sub (current_date,7)) 
        and month >= month (date_sub (current_date,7)) 
        and day   >= day   (date_sub (current_date,7))
;

原始查询出了什么问题?

unix\u时间戳()
以秒为单位获取当前unix时间戳。这个函数是不确定的,并且它的值对于查询执行的范围不是固定的,因此妨碍了对查询的适当优化-从2.0开始,这个函数就被弃用,取而代之的是当前的\u timestamp常量。
https://cwiki.apache.org/confluence/display/hive/languagemanual+udf
(我只是稍微修改了一下文档:-)
由于unix\u timestamp()的值在执行过程中可能会更改,因此应该为每一行计算表达式,从而防止分区消除。

为什么使用set不起作用? set 不过是一种文本替换机制。

过程中没有计算任何内容 set .
唯一发生的事情是变量被分配了一个文本。
在执行查询之前,变量占位符( ${hiveconf:...} )正在替换为指定的文本。
只有这样,查询才会被解析和执行。

hive> set a=sele;
hive> set b=ct 1+;
hive> set c=1;
hive> ${hiveconf:a}${hiveconf:b}${hiveconf:c};
OK
2

演示

create table table_name (column_name int) partitioned by (year int,month int,day int);

set hive.exec.dynamic.partition.mode=nonstrict;

insert into table_name partition (year,month,day) 

select  pos
       ,year(dt)
       ,month(dt)
       ,day(dt) 

from   (select  pe.pos
               ,date_sub (current_date,pe.pos) as dt

        from    (select 1) x 
                lateral view posexplode (split (space (99),' ')) pe
        ) t
;
explain dependency

select      count (column_name) 

from        table_name 

where       year  >= year  (date_sub (from_unixtime (unix_timestamp ()),7)) 
        and month >= month (date_sub (from_unixtime (unix_timestamp ()),7)) 
        and day   >= day   (date_sub (from_unixtime (unix_timestamp ()),7))
;

{“input\u partitions”:[{“partitionname”:default@table_name@year=2016/month=11/天=14“},{“分区名称”:default@table_name@year=2016/month=11/天=15“},{“分区名称”:default@table_name@year=2016/month=11/天=16“},{“分区名称”:default@table_name@year=2016/month=11/天=17“},{“分区名称”:default@table_name@year=2016/month=11/天=18“},{“分区名称”:default@table_name@year=2016/month=11/天=19“},{“分区名称”:default@table_name@year=2016/month=11/天=20“},{“分区名称”:default@table_name@year=2016/month=11/天=21“},{“分区名称”:default@table_name@year=2016/month=11/天=22“},{“分区名称”:default@table_name@year=2016/month=11/天=23“},{“分区名称”:default@table_name@year=2016/month=11/天=24“},{“分区名称”:default@table_name@year=2016/month=11/天=25“},{“分区名称”:default@table_name@year=2016/month=11/天=26“},{“分区名称”:default@table_name@year=2016/month=11/天=27“},{“分区名称”:default@table_name@year=2016/month=11/天=28“},{“分区名称”:default@table_name@year=2016/month=11/天=29“},{“分区名称”:default@table_name@year=2016/month=11/天=30“},{“分区名称”:default@table_name@year=2016/month=12/天=1“},{“分区名称”:default@table_name@year=2016/month=12/天=10“},{“分区名称”:default@table_name@year=2016/month=12/天=11“},{“分区名称”:default@table_name@year=2016/month=12/天=12“},{“分区名称”:default@table_name@year=2016/month=12/天=13“},{“分区名称”:default@table_name@year=2016/month=12/天=14“},{“分区名称”:default@table_name@year=2016/month=12/天=15“},{“分区名称”:default@table_name@year=2016/month=12/天=16“},{“分区名称”:default@table_name@year=2016/month=12/天=17“},{“分区名称”:default@table_name@year=2016/month=12/天=18“},{“分区名称”:default@table_name@year=2016/month=12/天=19“},{“分区名称”:default@table_name@year=2016/month=12/天=2“},{“分区名称”:default@table_name@year=2016/month=12/天=20“},{“分区名称”:default@table_name@year=2016/month=12/天=21“},{“分区名称”:default@table_name@year=2016/month=12/天=22“},{“分区名称”:default@table_name@year=2016/month=12/天=23“},{“分区名称”:default@table_name@year=2016/month=12/天=24“},{“分区名称”:default@table_name@year=2016/month=12/天=25“},{“分区名称”:default@table_name@year=2016/month=12/天=26“},{“分区名称”:default@table_name@year=2016/month=12/天=27“},{“分区名称”:default@table_name@year=2016/month=12/天=28“},{“分区名称”:default@table_name@year=2016/month=12/天=29“},{“分区名称”:default@table_name@year=2016/month=12/天=3“},{“分区名称”:default@table_name@year=2016/month=12/天=30“},{“分区名称”:default@table_name@year=2016/month=12/天=31“},{“分区名称”:default@table_name@year=2016/month=12/天=4“},{“分区名称”:default@table_name@year=2016/month=12/天=5“},{“分区名称”:default@table_name@year=2016/month=12/天=6“},{“分区名称”:default@table_name@year=2016/month=12/天=7“},{“分区名称”:default@table_name@year=2016/month=12/天=8“},{“分区名称”:default@table_name@year=2016/month=12/天=9“},{“分区名称”:default@table_name@year=2017/month=1/天=1“},{“分区名称”:default@table_name@year=2017/month=1/天=10“},{“分区名称”:default@table_name@year=2017/month=1/天=11“},{“分区名称”:default@table_name@year=2017/month=1/天=12“},{“分区名称”:default@table_name@year=2017/month=1/天=13“},{“分区名称”:default@table_name@year=2017/month=1/天=14“},{“分区名称”:default@table_name@year=2017/month=1/天=15“},{“分区名称”:default@table_name@year=2017/month=1/天=16“},{“分区名称”:default@table_name@year=2017/month=1/天=17“},{“分区名称”:default@table_name@year=2017/month=1/天=18“},{“分区名称”:default@table_name@year=2017/month=1/天=19“},{“分区名称”:default@table_name@year=2017/month=1/天=2“},{“分区名称”:default@table_name@year=2017/month=1/天=20“},{“分区名称”:default@table_name@year=2017/month=1/天=21“},{“分区名称”:default@table_name@year=2017/month=1/天=22“},{“分区名称”:default@table_name@year=2017/month=1/天=23“},{“分区名称”:default@table_name@year=2017/month=1/天=24“},{“分区名称”:default@table_name@year=2017/month=1/天=25“},{“分区名称”:default@table_name@year=2017/month=1/天=26“},{“分区名称”:default@table_name@year=2017/month=1/天=27“},{“分区名称”:default@table_name@year=2017/month=1/天=28“},{“分区名称”:default@table_name@year=2017/month=1/天=29“},{“分区名称”:default@table_name@year=2017/month=1/天=3“},{“分区名称”:default@table_name@year=2017/month=1/天=30“},{“分区名称”:default@table_name@year=2017/month=1/天=31“},{“分区名称”:default@table_name@year=2017/month=1/天=4“},{“分区名称”:default@table_name@year=2017/month=1/天=5“},{“分区名称”:default@table_name@year=2017/month=1/天=6“},{“分区名称”:default@table_name@year=2017/month=1/天=7“},{“分区名称”:default@table_name@year=2017/month=1/天=8“},{“分区名称”:default@table_name@year=2017/month=1/天=9“},{“分区名称”:default@table_name@year=2017/month=2/天=1“},{“分区名称”:default@table_name@year=2017/month=2/天=10“},{“分区名称”:default@table_name@year=2017/month=2/天=11“},{“分区名称”:default@table_name@year=2017/month=2/天=12“},{“分区名称”:default@table_name@year=2017/month=2/天=13“},{“分区名称”:default@table_name@year=2017/month=2/天=14“},{“分区名称”:default@table_name@year=2017/month=2/天=15“},{“分区名称”:default@table_name@year=2017/month=2/天=16“},{“分区名称”:default@table_name@year=2017/month=2/天=17“},{“分区名称”:default@table_name@year=2017/month=2/天=18“},{“分区名称”:default@table_name@year=2017/month=2/天=19“},{“分区名称”:default@table_name@year=2017/month=2/天=2“},{“分区名称”:default@table_name@year=2017/month=2/天=20“},{“分区名称”:default@table_name@year=2017/month=2/天=21“},{“分区名称”:default@table_name@year=2017/month=2/天=3“},{“分区名称”:default@table_name@year=2017/month=2/天=4“},{“分区名称”:default@table_name@year=2017/month=2/天=5“},{“分区名称”:default@table_name@year=2017/month=2/天=6“},{“分区名称”:default@table_name@year=2017/month=2/天=7“},{“分区名称”:default@table_name@year=2017/month=2/天=8“},{“分区名称”:default@table_name@year=2017/month=2/天=9“}],“input_tables”:[{“tablename”:default@table_name“,”tabletype“:”托管表“}]}

explain dependency

select      count (column_name) 

from        table_name 

where       year  >= year  (date_sub (current_date,7)) 
        and month >= month (date_sub (current_date,7)) 
        and day   >= day   (date_sub (current_date,7))
;

{“input\u partitions”:[{“partitionname”:default@table_name@year=2017/month=2/天=14“},{“分区名称”:default@table_name@year=2017/month=2/天=15“},{“分区名称”:default@table_name@year=2017/month=2/天=16“},{“分区名称”:default@table_name@year=2017/month=2/天=17“},{“分区名称”:default@table_name@year=2017/month=2/天=18“},{“分区名称”:default@table_name@year=2017/month=2/天=19“},{“分区名称”:default@table_name@year=2017/month=2/天=20“},{“分区名称”:default@table_name@year=2017/month=2/天=21“}],“input_tables”:[{“tablename”:default@table_name“,”tabletype“:”托管表“}]}

相关问题