我需要按分区(或组)对行进行排序,即如果我的源表是:
NAME PRICE
---- -----
AAA 1.59
AAA 2.00
AAA 0.75
BBB 3.48
BBB 2.19
BBB 0.99
BBB 2.50
我想得到目标表:
RANK NAME PRICE
---- ---- -----
1 AAA 0.75
2 AAA 1.59
3 AAA 2.00
1 BBB 0.99
2 BBB 2.19
3 BBB 2.50
4 BBB 3.48
通常我会用 ROW_NUMBER() OVER
函数,所以在apache hive中:
select
row_number() over (partition by NAME order by PRICE) as RANK,
NAME,
PRICE
from
MY_TABLE
;
不幸的是,cloudera impala不支持(目前) ROW_NUMBER() OVER
函数,所以我正在寻找解决方法。最好不要使用udaf,因为在政治上很难说服将其部署到服务器。
谢谢你的帮助。
3条答案
按热度按时间3pvhb19x1#
对于不支持窗口功能的系统,通常的解决方法如下:
sqlfiddle示例:http://sqlfiddle.com/#!2/3b027/2号
zpgglvta2#
这并不是如何使用impala的答案,但是hadoop上还有其他sql解决方案,它们已经提供了分析和子查询选项。如果没有这些功能,您可能将不得不依赖多步骤流程或一些udaf。
我是英菲尼德的建筑师
infinidb支持分析函数和子查询。
http://infinidb.co
在radiant advisors的基准测试中查看查询8,它是您所追求的类似样式的查询,使用秩分析函数。presto也能够以较慢(80倍)的速度运行这种风格的查询http://radiantadvisors.com/wp-content/uploads/2014/04/radiantadvisors_benchmark_sql-on-hadoop_2014q1.pdf
来自基准的查询(查询8)
结果
5jvtdoz23#
如果不能使用相关子查询执行此操作,则仍然可以使用联接执行此操作:
请注意,这并不完全适用
row_number()
除非所有的价格都是不同的name
. 这个公式实际上相当于rank()
.为了
row_number()
,需要唯一的行标识符。顺便说一句,以下是相当于
dense_rank()
: