一尘不染

查找昨天日期的每个BUYER_ID的前10条最新记录

sql

这是下表

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_IDAND的那些相对应CREATED_TIME。每当我要为每个日期触发此查询(意味着昨天的日期)时,我只需要今天日期前一天的时间的10个最新记录为依据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

我正在使用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的方法?


阅读 143

收藏
2021-03-10

共1个答案

一尘不染

  SELECT FIRST 10 *
    FROM TestingTable1
   WHERE buyer_id = 34512201
ORDER BY created_time DESC;
2021-03-10