这是下表
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和CREATED_TIME的那些.每当我将为每个BUYER_ID触发此查询(意味着昨天的日期)时,我只需要在今天的日期前一天的时间上记录10个最新记录.
所以对于这个BUYER_ID – 34512201我在CREATED_TIME的每个BUYER_ID基础上需要10个最新记录,仅用于昨天的日期.
每个BUYER_ID都可以包含任何一天的数据.但是我通过在CREATED_TIME检查,对今天的数据(总是指昨天的日期)前一天特别感兴趣
查找昨天的每个BUYER_ID的TOP 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
我正在使用Hive和Hive支持sql语法.所以我需要确保sql也应该在Hive环境中工作.
谁能帮我这个?
更新: –
我正在使用下面的查询,我需要从下面的查询中获得前10名,并且需要为日期检查添加一个限定符,意味着在昨天的日期的where子句中 – 我不能在这里使用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,rank(item_id) as rk,created_time FROM testingtable1 DISTRIBUTE BY buyer_id,item_id SORT BY buyer_id,created_time desc ) a WHERE rk < 10 ORDER BY buyer_id,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,有没有办法做到这一点?
解决方法
SELECT FIRST 10 * FROM TestingTable1 WHERE buyer_id = 34512201 ORDER BY created_time DESC;