これが下の表です
CREATE TABLE IF NOT EXISTS TestingTable1
(
BUYER_ID BIGINT,
ITEM_ID BIGINT,
CREATED_TIME STRING
)
そして、これは上記の表の下のデータです-
BUYER_ID | ITEM_ID | CREATED_TIME
------------+------------------+-----------------------
1015826235 220003038067 2012-07-09 19:40:21,
1015826235 300003861266 2012-07-09 18:19:59,
1015826235 140002997245 2012-07-09 09:23:17,
1015826235 210002448035 2012-07-09 22:21:11,
1015826235 260003553381 2012-07-09 07:09:56,
1015826235 260003553382 2012-07-09 19:40:39,
1015826235 260003553383 2012-07-09 06:58:47,
1015826235 260003553384 2012-07-09 07:28:47,
1015826235 260003553385 2012-07-09 08:48:47,
1015826235 260003553386 2012-07-09 06:38:47,
1015826235 260003553387 2012-07-09 05:38:47,
1015826235 260003553388 2012-07-09 04:55:47,
1015826235 260003553389 2012-07-09 06:54:37,
34512201 597245693 2012-07-09 16:20:21,
34512201 8071787728 2012-07-09 15:19:59,
34512201 5868222883 2012-07-09 08:23:17,
34512201 2412180494 2012-07-09 22:21:11,
34512201 2422054205 2012-07-09 06:09:56,
34512201 1875744030 2012-07-09 19:40:39,
34512201 5639158173 2012-07-09 06:58:47,
34512201 5656232360 2012-07-09 07:28:47,
34512201 959188449 2012-07-09 08:48:47,
34512201 4645350592 2012-07-09 06:38:47,
34512201 5657320532 2012-07-09 05:38:47,
34512201 290419656539 2012-07-09 04:55:47,
表に上記のデータが表示されている場合、 UNIQUEとANDBUYER_ID
に対応するものは2 つしかありません。このクエリ (昨日の日付を意味する) を各.ITEM_ID
CREATED_TIME
BUYER_ID
したがって、このためには、昨日の日付のみにBUYER_ID
基づいて34512201
、各基準に 10 個の最新のレコードが必要です。BUYER_ID
CREATED_TIME
そして、それぞれBUYER_ID
が任意の日のデータを持つことができます。しかし、私は今日のデータの前日(常に昨日の日付を意味する)に特に興味がありますCREATED_TIME
昨日の日付TOP 10
ごとに最新のデータを検索します。BUYER_ID
以下は、それぞれに対応して取得する必要があるサンプル出力ですBUYER_ID
。
サンプル出力。
BUYER_ID | ITEM_ID | CREATED_TIME
------------+------------------+-----------------------
34512201 2412180494 2012-07-09 22:21:11
34512201 1875744030 2012-07-09 19:40:39
34512201 597245693 2012-07-09 16:20:21
34512201 8071787728 2012-07-09 15:19:59
34512201 959188449 2012-07-09 08:48:47
34512201 5868222883 2012-07-09 08:23:17
34512201 5656232360 2012-07-09 07:28:47
34512201 5639158173 2012-07-09 06:58:47
34512201 4645350592 2012-07-09 06:38:47
34512201 2422054205 2012-07-09 06:09:56
1015826235 210002448035 2012-07-09 22:21:11
1015826235 260003553382 2012-07-09 19:40:39
1015826235 220003038067 2012-07-09 19:40:21
1015826235 300003861266 2012-07-09 18:19:59
1015826235 140002997245 2012-07-09 09:23:17
1015826235 260003553385 2012-07-09 08:48:47
1015826235 260003553384 2012-07-09 07:28:47
1015826235 260003553381 2012-07-09 07:09:56
1015826235 260003553383 2012-07-09 06:58:47
1015826235 260003553389 2012-07-09 06:54:37
私はSQL のような構文を使用しHive
てサポートしています。Hive
そのため、SQL が Hive 環境でも機能することを確認する必要があります。
誰でもこれで私を助けることができますか?
アップデート:-
以下のクエリを使用しており、以下のクエリから最新のトップ 10 を取得する必要があり、日付チェックのために修飾子をもう 1 つ追加する必要があります。つまり、Hive はSQL 構文をサポートしていないため、ここでwhere clause for yesterday's date
は使用できません。この問題を解決するには、別の方法が必要です。TOP 10
TOP 10
SELECT * FROM TestingTable1 WHERE ORDER BY buyer_id, created_time DESC;
もう1つの更新:-
を使用して、以下のクエリを書きましたRANK UserDefinedFunction
。
SELECT buyer_id, item_id, created_time, rk
FROM (
SELECT buyer_id, item_id, rank(item_id) as rk, created_time
FROM testingtable1
DISTRIBUTE BY buyer_id, item_id
SORT BY buyer_id, item_id, created_time desc
) a
WHERE rk < 10
ORDER BY buyer_id, created_time, rk;
そして、これは Java の RANK UDF 関数です。
package com.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public final class Rank extends UDF{
private int counter;
private String last_key;
public int evaluate(final String key){
if ( !key.equalsIgnoreCase(this.last_key) ) {
this.counter = 0;
this.last_key = key;
}
return this.counter++;
}
}
そして、上記のクエリは私が望んでいたようには機能しません。そのクエリでは、ある種のひねりを加える必要があります。
HiveQL で UDF を使用せずにこれを行う方法はありますか?