這是見下表找到每個BUYER_ID TOP 10的最新紀錄爲昨天的日期
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 BUYER_ID
,對應那些我有ITEM_ID
AND CREATED_TIME
。我只需要在今天的日期前一天的時間,以每個BUYER_ID
的這個查詢(意思是昨天的日期)的時間爲10個最新記錄基礎。
因此,對於這個BUYER_ID
- 34512201
我需要爲每個BUYER_ID
基礎上CREATED_TIME
只有昨天的日期10最新記錄。
而且每個BUYER_ID
可以有任何一天的數據。但我對前一天今天的數據(指總昨天的日期)通過在CREATED_TIME
檢查找到每個BUYER_ID
TOP 10
最新數據,昨天的日期特別感興趣。以下是我應該獲得的對應於每個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
我與Hive
和Hive
工作支持SQL的語法。所以我需要確保SQL也可以在Hive環境中工作。
任何人都可以幫助我嗎?
更新: -
我使用下面的查詢,我需要獲得前10名從下面的查詢最新的和需要添加日期檢查多了一個限定詞,指在where clause for yesterday's date
- 我不能使用TOP 10
因爲Hive不支持TOP 10
sql語法。我需要一些其他方式來解決這個問題。
SELECT * FROM TestingTable1 WHERE ORDER BY buyer_id, created_time DESC;
一個更多更新: -
我使用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;
這是RANK UDF功能Java的
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?
您應該明確說明您正在使用哪種SQL語言。 – mawburn 2012-07-10 01:33:57
我正在使用Hive和Hive支持SQL Like語法,所以這就是我將這個問題標記爲'SQL'的原因。我認爲oracle語法在這裏可以正常工作。 – ferhan 2012-07-10 01:37:38
@波希米亞,任何想法如何做到這一點? – ferhan 2012-07-10 01:53:16