使用row_number()选择第一行

时间:2017-06-19 15:46:39

标签: sql hadoop hive

我想知道ROW_NUMBER()的性能: 在我的测试用例中,我有许多元素,每个元素中有大量(~100k)条目。我想为每个元素选择第一个条目:

SELECT * FROM(    
    SELECT 
      element, msg, timestamp, 
      ROW_NUMBER() OVER(PARTITION BY element ORDER BY timestamp) as rank
    FROM table
) t1
WHERE rank = 1

对于我来说,为了保留第一个分区而需要为每个分区订购所有100k行似乎太过分了。类似于MIN()函数的东西应该天真地表现得更好。 所以我试过这样的事情:

SELECT
  element, MIN(a)[0] as timestamp, MIN(a)[1] as msg
FROM(
    SELECT element, ARRAY(timestamp, msg) as a
    FROM table
) t1
GROUP BY partition

但是当比较两种方法的CPU使用率时,我的性能相同。 ROW_NUMBER()优化器是否比我想象的要聪明,还是我错过了什么?

编辑:我的原始查询中有错误。现在看一下结果,看起来MIN(ARRAY)方法比ROW_NUMBER()过滤器相当快。是否有更简单的规范方法来实现FIRST_ROW OVER(PARTITION)过滤器,而无需定义大规模数组然后解构它?

1 个答案:

答案 0 :(得分:-1)

你错过了什么。 GROUP BY需要做很多工作 - 看似与ROW_NUMBER()类似。

我并不熟悉Hive的底层机制。在大多数数据库中,ROW_NUMBER()将获取行的物理标识符,各种键,并单独对它们进行排序。然后,使用物理标识符,可以将值快速添加回原始数据。当然,细节可能因数据库而异,但这是一般的想法。

Hive可能不会这样做。但是,无论它做什么,在努力方面都与GROUP BY类似。