2012-07-10 21 views
3

這是見下表找到每個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_IDTOP 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 

我與HiveHive工作支持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?

+2

您應該明確說明您正在使用哪種SQL語言。 – mawburn 2012-07-10 01:33:57

+1

我正在使用Hive和Hive支持SQL Like語法,所以這就是我將這個問題標記爲'SQL'的原因。我認爲oracle語法在這裏可以正常工作。 – ferhan 2012-07-10 01:37:38

+0

@波希米亞,任何想法如何做到這一點? – ferhan 2012-07-10 01:53:16

回答

2
SELECT FIRST 10 * 
    FROM TestingTable1 
    WHERE buyer_id = 34512201 
ORDER BY created_time DESC; 
+0

感謝弗蘭克評論。我不是特定於'buyer_id'。它可以很多。而我並不需要第一個10.我需要在那個特定的一天最新的。以最新的方式,最後10次爲該特定的'BUYER_ID',按照降序排列 – ferhan 2012-07-10 01:53:01

+0

既然你給出了這個例子,我用它作爲我的例子:) ..好吧,通過在DESCending中指定created_time,FIRST 10將是最新的10行? ..ahh,爲什麼created_time沒有被定義爲DATETIME數據類型?並且如果您想要以前的日期結果,則可以將限定符添加到WHERE子句。 – 2012-07-10 01:58:07

+0

我不知道他們爲什麼沒有定義爲'DATETIME'數據類型。我正在研究別人的設計。他們將其定義爲一個字符串。所以我必須使用我的猜測。我也發佈了示例輸出。 – ferhan 2012-07-10 02:01:23