找到每个BUYER_ID TOP 10的最新纪录为昨天的日期(Find TOP 10 latest

2019-06-26 03:55发布

这是见下表

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,

如果你看到表上面的数据中,只有两个独特BUYER_ID和对应于那些我有ITEM_IDCREATED_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应在蜂房环境下正常工作。

谁能帮我这个?

更新: -

我使用下面的查询,我需要获得前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;

这是基于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?

Answer 1:

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


文章来源: Find TOP 10 latest record for each BUYER_ID for yesterday's date