这是下表
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
ITEM_ID
CREATED_TIME
因此,对于这个BUYER_ID-34512201我需要10个最新记录每个BUYER_ID对基础CREATED_TIME仅供昨天的日期。
34512201
每个人都BUYER_ID可以拥有任何一天的数据。但是,我对今天的数据(总是指昨天的日期)之前的日期特别感兴趣,方法是查看CREATED_TIME
查找TOP 10每个BUYER_ID昨天的日期的最新数据。以下是我应该与之对应的示例输出BUYER_ID。
TOP 10
样本输出。
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环境中工作。
Hive
谁能帮我这个?
更新:-
我正在使用以下查询,我需要从以下查询中获取最新的前10名,并且需要再添加一个用于日期检查的限定符,这意味着where clause for yesterday's date-我不能TOP 10在这里使用,因为Hive不支持TOP 10sql语法。我需要其他方法来解决此问题。
where clause for yesterday's date
SELECT * FROM TestingTable1 WHERE ORDER BY buyer_id, created_time DESC;
一项更新:-
我在下面的查询中使用编写了此查询RANK UserDefinedFunction。
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的方法?
SELECT FIRST 10 * FROM TestingTable1 WHERE buyer_id = 34512201 ORDER BY created_time DESC;