hive在计算列上的分区修剪

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

我在配置单元上有一些表,我的查询正在尝试检索过去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

jckbn6z7

jckbn6z71#

当筛选表达式包含非确定性函数(如)时,配置单元不会触发分区修剪 unix_timestamp() .
讨论中提到了一个很好的理由:
想象一下你的情况: WHERE partition_column = f(unix_timestamp()) AND ordinary_column = f(unix_timestamp) .
predicate 的右侧必须在Map时求值,而您假设左侧应该在编译时求值,这意味着有两个不同的unix\u timestamp()值浮动,这只会导致错误的结果。

相关问题