在 Tez 上使用 Hive 对此视图运行此查询会导致全表扫描,即使 regionid 和 id 上有一个分区。Cloudera Impala 中的此查询需要 0.6 秒才能完成,而使用 Hortonworks Data Platform 和 Tez 上的 Hive 则需要 800 秒。我得出的结论是,在 Tez 上的 Hive 中,使用窗口函数可以防止谓词被下推到内部选择,从而导致全表扫描。
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 函数将这个表连接到自身以获取最新记录,它可以工作,并在几秒钟内完成,但对于我的用例来说仍然太慢。此外,如果我删除窗口函数,谓词会被下推,这将在毫秒内返回。
如果有人有任何想法,将不胜感激。