计算列上的Hive分区修剪

Raj*_*thi 3 hadoop hive amazon-s3 emr

我在Hive上有几个表,我的查询试图检索过去x天的数据.当我使用直接日期时,Hive正在修剪分区,但是在使用公式时正在进行全表扫描.

select *
from   f_event
where  date_key > 20160101;

scanned partitions..

s3://...key=20160102 [f]
s3://...key=20160103 [f]
s3://...key=20160104 [f]
Run Code Online (Sandbox Code Playgroud)

如果我使用公式,比如说,获取过去4周的数据

Select count(*)
From    f_event f
Where  date_key  > from_unixtime(unix_timestamp()-2*7*60*60*24, 'yyyyMMdd')
Run Code Online (Sandbox Code Playgroud)

这是扫描表中的所有分区.

环境:Hadoop 2.6.0,EMR,Hive on S3,Hive 1.0.0

小智 6

当过滤表达式包含非确定性函数(如unix_timestamp().)时,Hive不会触发分区修剪.

讨论中提到了一个很好的理由:

想象一下您遇到的情况:

WHERE partition_column = f(unix_timestamp()) AND ordinary_column = f(unix_timestamp).

谓词的右侧必须在映射时进行评估,而你假设左侧应该在编译时进行评估,这意味着你有两个不同的unix_timestamp()浮动值,它们只能结束厉害.