Tez下推谓词上的Hive在分区表

时间:2016-01-05 21:56:38

标签: hadoop hive hortonworks-data-platform apache-tez

在Tez上使用Hive对此视图运行此查询会导致全表扫描,即使regionid和id上有分区也是如此。 Cloudera Impala中的此查询需要0.6秒才能完成,并且在Tez上使用Hortonworks Data Platform和Hive需要花费800秒。我得出的结论是,在Hiz on Tez上使用窗口函数可以防止将谓词下推到内部选择,从而导致全表扫描。

CREATE VIEW latestposition AS
WITH t1 AS (
  SELECT *, ROW_NUMBER() OVER ( PARTITION BY regionid, id, deviceid order by ts desc) AS rownos FROM positions 
)
SELECT *
FROM t1
WHERE rownos = 1; 

SELECT * FROM latestposition WHERE  regionid='1d6a0be1-6366-4692-9597-ebd5cd0f01d1' and id=1422792010 and deviceid='6c5d1a30-2331-448b-a726-a380d6b3a432';

我尝试使用MAX函数将此表连接到自身以获取最新记录,它可以工作,并在几秒钟内完成,但对于我的用例来说仍然太慢。此外,如果我删除窗口函数,谓词会被推下来,这将以毫秒为单位返回。

如果有人有任何想法,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

对于任何有兴趣的人,我都会在Hortonworks社区论坛上发布此问题。那边的好人在Hive Jira上针对这个问题提出了一个错误,并且正在积极研究它。

https://community.hortonworks.com/questions/8880/hive-on-tez-pushdown-predicate-doesnt-work-in-part.html

https://issues.apache.org/jira/browse/HIVE-12808

答案 1 :(得分:0)

这是预期的行为。要避免全表扫描,您必须应用这样的where条件(您不能通过使用视图)。这是大多数数据库的限制。分析函数应该在数据被过滤后应用,因为它将在内部创建临时表。

WITH t1 AS (
  SELECT *, ROW_NUMBER() OVER ( PARTITION BY regionid, id, deviceid order by ts desc) AS rownos FROM positions **<where condition>**
)
SELECT *
FROM t1
WHERE rownos = 1;