LoginSignup
11
7

More than 5 years have passed since last update.

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

Posted at

Rank付け

RANK関数で順序をつけるときの順序の付け方って何がベストなのか、について気になったので。
RANK付けには2種類が有ると思います。
1. 同一の値の場合には、同じ番号を付与する
2. 同一の値の場合には、別の番号を付与する

1の例(user_idとアクセス時間でRank):

number user_id date
1 userA 2014-01-01
2 userA 2014-01-02
2 userA 2014-01-02
4 userB 2014-01-01

2の例(user_idとアクセス時間でRank):

number user_id date
1 userA 2014-01-01
2 userA 2014-01-02
3 userA 2014-01-02
4 userB 2014-01-01

なぜ気になったのか

TreasureDataには、TD_X_RANKという独自UDFのRANK関数がでは、2を採用しているが、
PrestoのRANK関数では1を採用しており、一般的にどちらが好まれるのかな?と疑問に思ったため。

TreasureDataのTD_X_RANKを試してみる

SELECT 
  TD_X_RANK(USER) AS rank,
  USER,
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd HH:mm:ss',
    'JST') AS time
FROM (
    SELECT 
      USER,
      time
    FROM
      www_access
    CLUSTER BY USER, time
  ) t

hive.png

PrestoのRANKを試してみる

SELECT 
  RANK(
  ) OVER(
    PARTITION BY USER
  ORDER BY
    time
  ) AS rnk,
  USER,
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd HH:mm:ss',
    'JST') AS time
FROM
  www_access
ORDER BY
  USER,
  rnk

presto.png

おわりに

書いてておもったのですが、TD_X_RANKは、Prestoのrow_number関数と同じだと思えばよかったのですね。
なるほどなるほど。

PrestoのROW_NUMBERを試してみる

SELECT 
  ROW_NUMBER(
  ) OVER(
    PARTITION BY USER
  ORDER BY
    time
  ) AS rnk,
  USER,
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd HH:mm:ss',
    'JST') AS time
FROM
  www_access
ORDER BY
  USER,
  rnk

row_number.png

おわりにpart.2

Hiveでrow_numberがなかったっけ?とおもったら、0.11以上からでした。
なるほどなるほど。

11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7