Tez 下推谓词上的 Hive 在分区 table 上使用 window 函数的视图中不起作用
Hive on Tez Pushdown Predicate doesn't work in view using window function on partitioned table
在 Tez 上使用 Hive 运行 此针对此视图的查询会导致完整 table 扫描,即使在 regionid 和 id 上存在分区也是如此。 Cloudera Impala 中的此查询需要 0.6 秒才能完成,而使用 Hortonworks 数据平台和 Tez 上的 Hive 则需要 800 秒。我得出的结论是,在 Tez 上的 Hive 中使用 window 函数可以防止谓词被下推到内部 select,从而导致完整的 table 扫描。
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 函数将此 table 连接到自身以获取最新记录,它有效,并在几秒钟内完成,但对于我的用例来说仍然太慢。此外,如果我删除 window 函数,谓词将被下推,这将在毫秒内 return。
如果有人有任何想法,我们将不胜感激。
这是预期的行为。为避免完整 table 扫描,您必须像这样应用 where 条件(您不能通过使用视图)。这是大多数数据库的局限性。分析函数应该在过滤数据后应用,因为它将在内部创建临时 tables。
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;
对于任何感兴趣的人,我在 Hortonworks 社区论坛上发布了这个问题。那边的好心人针对这个问题在 Hive Jira 上提出了一个 bug,并且正在积极解决这个问题。
在 Tez 上使用 Hive 运行 此针对此视图的查询会导致完整 table 扫描,即使在 regionid 和 id 上存在分区也是如此。 Cloudera Impala 中的此查询需要 0.6 秒才能完成,而使用 Hortonworks 数据平台和 Tez 上的 Hive 则需要 800 秒。我得出的结论是,在 Tez 上的 Hive 中使用 window 函数可以防止谓词被下推到内部 select,从而导致完整的 table 扫描。
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 函数将此 table 连接到自身以获取最新记录,它有效,并在几秒钟内完成,但对于我的用例来说仍然太慢。此外,如果我删除 window 函数,谓词将被下推,这将在毫秒内 return。
如果有人有任何想法,我们将不胜感激。
这是预期的行为。为避免完整 table 扫描,您必须像这样应用 where 条件(您不能通过使用视图)。这是大多数数据库的局限性。分析函数应该在过滤数据后应用,因为它将在内部创建临时 tables。
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;
对于任何感兴趣的人,我在 Hortonworks 社区论坛上发布了这个问题。那边的好心人针对这个问题在 Hive Jira 上提出了一个 bug,并且正在积极解决这个问题。