3

这是下表

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,

如果您在表中看到上述数据,则只有两个 UNIQUEBUYER_ID并且对应于我拥有的那些ITEM_IDAND CREATED_TIME。每当我为每个BUYER_ID.

所以为此BUYER_ID-我只需要昨天日期34512201的每个BUYER_ID基础上的 10 条最新记录。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

我正在使用HiveHive支持类似 SQL 的语法。所以我需要确保 SQL 也应该在 Hive 环境中工作。

谁能帮我这个?

更新:-

我正在使用下面的查询,我需要从下面的查询中获取最新的前 10 名,并且需要再添加一个限定符以进行日期检查,这意味着where clause for yesterday's date- 我不能TOP 10在这里使用,因为 Hive 不支持TOP 10sql 语法。我需要其他方法来解决这个问题。

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;

这是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 的情况下做到这一点?

4

3 回答 3

2
  SELECT FIRST 10 *
    FROM TestingTable1
   WHERE buyer_id = 34512201
ORDER BY created_time DESC;
于 2012-07-10T01:51:58.050 回答
0

我迟到了回答这个问题,我相信你一定知道在 Hive 中使用 row_number 函数。只是作为对先前良好讨论的参考的补充。

select * from
(select buyer_id,item_id,created_time, row_number() over(partition by buyer_id over
created_time asc) row_num from yourtable)tab
where tab.row_num<=5;
于 2019-06-04T09:15:10.403 回答
0
select * 
from (select buyer_id,item_id,created_time,row_num() over (partition by buyer_id order by created_time DESC)) a 
where a.row_num<=10
于 2019-09-04T12:57:51.893 回答