我在配置单元上有一些表,我的查询正在尝试检索过去x天的数据。当我使用直接日期时,hive正在修剪分区,但是当我使用公式时,hive正在执行全表扫描。
select *
from f_event
where date_key > 20160101;
scanned partitions..
s3://...key=20160102 [f]
s3://...key=20160103 [f]
s3://...key=20160104 [f]
如果我用一个公式,比如说,得到过去4周的数据
Select count(*)
From f_event f
Where date_key > from_unixtime(unix_timestamp()-2*7*60*60*24, 'yyyyMMdd')
这是扫描表中的所有分区。
环境:hadoop 2.6.0、emr、s3上的hive、hive 1.0.0
1条答案
按热度按时间jckbn6z71#
当筛选表达式包含非确定性函数(如)时,配置单元不会触发分区修剪
unix_timestamp()
.讨论中提到了一个很好的理由:
想象一下你的情况:
WHERE partition_column = f(unix_timestamp()) AND ordinary_column = f(unix_timestamp)
.predicate 的右侧必须在Map时求值,而您假设左侧应该在编译时求值,这意味着有两个不同的unix\u timestamp()值浮动,这只会导致错误的结果。