でHiveクエリを書くとき - TD_X_RANKを利用しよう


はじめに

Treasure DataはHiveの関数以外に独自関数を。。。(略

ドキュメント:Supported Hive UDFs

ドキュメントを見れば、ここから下は不要だ。

TD_X_RANK

とあるグループの中で並べられた要素に番号を振っていく関数です。まず、Order byかCluster byとかで関連カラムを並べ替える必要があります。全体に順番つけるの無理なので注意してください。

Signature
long TD_X_RANK(keys)

利用例

下のような成績データがあります。AクラスとBクラスの成績です。
これをクラス、成績で並べ替えます。

time class id score
2015-06-09 A 1 90
2015-06-09 A 2 95
2015-06-09 A 3 90
2015-06-09 A 4 30
2015-06-09 A 5 40
2015-06-09 A 6 75
2015-06-09 A 7 99
2015-06-09 A 8 89
2015-06-09 A 9 75
2015-06-09 A 10 80
2015-06-09 B 1 50
2015-06-09 B 2 95
2015-06-09 B 3 90
2015-06-09 B 4 90
2015-06-09 B 5 40

並べ替えます。td_x_rankに指定するのはclassなんで注意してください。scoreを囲みたくなりますが、class....

select class,td_x_rank(class) as rank , score,id
from ( select class, score ,id from testx order by class ,score desc,id) t

各クラスで成績が良い順に番号が付きましたね!

class rank score id
A 1 99 7
A 2 95 2
A 3 90 1
A 4 90 3
A 5 89 8
A 6 80 10
A 7 75 6
A 8 75 9
A 9 40 5
A 10 30 4
B 1 95 2
B 2 90 3
B 3 90 4
B 4 50 1
B 5 40 5

まとめ

なんで同じ点数なのに番号増えているの?的な話は下の記事を読むとさらに理解が深まります。(私が書いたんじゃないですが。。)

TreasureDataのUDFとPrestoでのRank関数の挙動について