Hive计算列的分区修剪

4

我在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]

如果我使用一个公式来获取过去四周的数据,比如说:
Select count(*)
From    f_event f
Where  date_key  > from_unixtime(unix_timestamp()-2*7*60*60*24, 'yyyyMMdd')

这是在表中扫描所有分区。

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

1个回答

7
当过滤表达式包含非确定性函数(如unix_timestamp())时,Hive不会触发分区剪枝。
讨论中提到了一个很好的理由:
想象一种情况,你有以下查询条件: WHERE partition_column = f(unix_timestamp()) AND ordinary_column = f(unix_timestamp)。 谓词的右侧必须在映射时计算,而左侧应该在编译时计算,这意味着你有两个不同的unix_timestamp()值,这只会导致问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接