2012-07-10 3 views
3

각 BUYER_ID을위한 TOP 10의 최신 기록을 찾기 그리고 이것은 위의 테이블 -에서 아래 데이터입니다이 아래 표</p> <pre><code>CREATE TABLE IF NOT EXISTS TestingTable1 ( BUYER_ID BIGINT, ITEM_ID BIGINT, CREATED_TIME STRING ) </code></pre> <p>어제 날짜

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_IDCREATED_TIME 인 테이블에 해당합니다. 각 BUYER_ID에 대해이 쿼리 (어제의 날짜를 의미)를 실행할 때마다 오늘 날짜 이전의 시간에 최신 기록 기준 10 개가 필요합니다.

그래서이 BUYER_ID에 대한 - 34512201 나는 어제의 날짜 CREATED_TIMEBUYER_ID 기준으로 10 최신 기록을해야합니다.

BUYER_ID은 모든 요일의 데이터를 가질 수 있습니다. 그러나 나는 어제 날짜 각 BUYER_ID에 대한 TOP 10 최신 데이터를 찾기 CREATED_TIME

에서 확인하여 (항상 어제의 날짜를 의미합니다) 오늘날의 데이터 전날에 특히 관심이 있습니다. 아래는 각 BUYER_ID에 해당하는 샘플 출력입니다.

샘플 출력. 내가 HiveHive 함께 일하고

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을 지원합니다. 그래서 하이브 환경에서도 SQL이 제대로 작동하는지 확인해야합니다.

아무도 도와 줄 수 있습니까?

업데이트 : -

나는 아래의 쿼리를 사용하고 내가 최고 얻을 필요가 10 아래 쿼리에서 최신 날짜 확인을위한 또 하나의 한정자를 추가 할 필요는 where clause for yesterday's date 의미 - 나는 TOP 10을 사용할 수 없습니다 여기서 하이브는 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; 

는 그리고 이것은 자바 -

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++; 
     } 
    } 

에서 RANK의 UDF 기능입니다 그리고 난에 원하는 방식으로 작동하지 않는 쿼리 위, 트위스트 일종의 내가 그 쿼리에 맞춰 만들 수있다.

HiveQL에서 UDF를 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

+2

사용중인 SQL 언어를 구체적으로 말해야합니다. – mawburn

+1

나는 하이브 (Hive)와 함께 작업 중이며 하이브 (Hive)는 SQL과 유사한 구문을 지원하므로이 질문을 'SQL'이라고 표시한다. 나는 오라클 구문이 잘 작동 할 것이라고 생각한다. – ferhan

+0

@ 보헤미안, 어떻게 생각하세요? – ferhan

답변

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

의견을 보내 주신 Frank 께 감사드립니다. 그 'buyer_id'에만 국한된 것은 아닙니다. 그것은 많은 수 있습니다. 그리고 First 10은 필요하지 않습니다. 그 특별한 날에는 최신 정보가 필요합니다. 가장 최근의 수단으로 그 특정 BUYER_ID에 대한 마지막 10 시간을 내림차순으로 – ferhan

+0

당신이 그 예제를 주었기 때문에 나는 그것을 나의 예제로 사용했다. .. 글쎄, DESCending에서 ORDERing created_time에 의해, 가장 먼저 10은 최근 10 개의 행이 될 것인가? ..hh, 왜 created_time이 DATETIME 데이터 유형으로 정의되지 않았습니까? 그리고 이전 요일 결과가 필요하면 WHERE 절에 한정자를 추가 할 수 있습니다. –

+0

왜 그들이 'DATETIME' 데이터 유형으로 정의되지 않았는지 모르겠습니다. 나는 다른 누군가의 설계 작업을하고 있습니다. 그들은 그것을 문자열로 정의했습니다. 그래서 나는 그것을 추측해야합니다. 샘플 출력도 게시했습니다. – ferhan