gpt4 book ai didi

hadoop - HiveQL 和排名()

转载 作者:可可西里 更新时间:2023-11-01 14:42:51 24 4
gpt4 key购买 nike

我无法理解 HiveQL rank()。我在 WWW 上发现了几个排名 UDF 的实现,例如 Edward's nice example .我可以加载和访问这些功能,但我无法让它们做我想做的事。这是一个详细的例子:

将 UDF 加载到 CLI 进程中:

$ javac -classpath /home/hadoop/hadoop/hadoop-core-1.0.4.jar:/home/hadoop/hive/lib/hive-exec-0.10.0.jar com/m6d/hiveudf/Rank2.java 
$ jar -cvf Rank2.jar com/m6d/hiveudf/Rank2.class
hive> ADD JAR /home/hadoop/MyDemo/Rank2.jar;
hive> CREATE TEMPORARY FUNCTION Rank2 AS 'com.m6d.hiveudf.Rank2';

创建表:

create table purchases (
SalesRepId String,
PurchaseOrderId INT,
Amount INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

从此 CSV 加载数据:

Jana,1,100
Nadia,2,200
Nadia,3,600
Daniel,4,80
Jana,5,120
William,6,170
Daniel,7,140

通过 CLI:

LOAD DATA 
LOCAL INPATH '/home/hadoop/MyDemo/purchases.csv'
INTO TABLE purchases;

现在我可以看到我的顶级销售代表:

select SalesRepId,sum(amount) as volume
from purchases
group by SalesRepId
ORDER BY volume DESC;

Nadia 卖出了 800 美元的东西,Daniel 和 Jana 都卖出了 220 美元,William 卖出了 170 美元

SalesRep    Amount
-------- ------
Nadia 800
Daniel 220
Jana 220
William 170

现在我只想给他们编号:Nadia 排名第一,Daniel 和 Jana 并列排名第二,William 排名第四(不是第三)

select SalesRepId, V.volume,rank2(V.volume)
from
(select SalesRepId,sum(amount) as volume
from purchases
group by SalesRepId
ORDER BY volume DESC) V;

这是我得到的,但不是我想要的:

SalesRep   Amount  Rank
-------- ------ ----
Nadia 800 1
Daniel 220 1
Jana 220 2
William 170 1

这是我想要的,但我不能让 hive 为我做:

SalesRep   Amount  Rank
-------- ------ ----
Nadia 800 1
Daniel 220 2
Jana 220 2
William 170 4

你能帮我用正确的 HiveQL 对我的销售代表进行排名吗?

感谢 JtheRocker 的回复。他的更改产生了这个列表:

SalesRep   Amount  Rank
-------- ------ ----
William 170 1
Daniel 220 2
Jana 220 2
Nadia 800 3

稍微修改一下,将 Nadia 显示为第 4(不是第 3):

private row_number;
@Override
public Object evaluate(DeferredObject[] currentKey) throws HiveException {
row_number++;
if (!sameAsPreviousKey(currentKey)) {
this.counter = row_number;
copyToPreviousKey(currentKey);
}
return new Long(this.counter);
}

最佳答案

随着Windowing and Analytics functions在 Hive 0.11 中引入,您可以使用:

select SalesRepId, volume as amount , rank() over (order by V.volume desc) as rank from 
(select SalesRepId,sum(amount) as volume from purchases group by SalesRepId) V;

关于hadoop - HiveQL 和排名(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com