Я не могу понять HiveQL rank (). Я нашел пару реализаций UDF ранга в WWW, например прекрасный пример Эдварда < / а>. Я могу загружать функции и получать к ним доступ, но не могу заставить их делать то, что я хочу. Вот подробный пример:
Загрузка 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
С помощью этого из интерфейса командной строки:
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;
Надя продала вещей на 800 долларов, Даниэль и Яна продали по 220 долларов, а Уильям продал за 170 долларов.
SalesRep Amount
-------- ------
Nadia 800
Daniel 220
Jana 220
William 170
Теперь все, что я хочу сделать, это пронумеровать их: Надя - №1, Даниэль и Яна - №2, а Уильям - №4 (а не №3).
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
Это то, что Я ХОЧУ, но не могу заставить улей сделать это за меня:
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
Небольшая модификация, чтобы Надя отображалась как 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);
}