Encontre o registro mais recente do TOP 10 para cada BUYER_ID da data de ontem
Esta é a tabela abaixo
CREATE TABLE IF NOT EXISTS TestingTable1
(
BUYER_ID BIGINT,
ITEM_ID BIGINT,
CREATED_TIME STRING
)
E estes são os dados abaixo na tabela acima
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,
Se você ver os dados acima na tabela, existem apenas dois dados UNIQUEBUYER_ID
e correspondente àqueles que tenhoITEM_ID
ECREATED_TIME
. Preciso de apenas 10 registros mais recentes sobre o horário do dia anterior à data de hoje sempre que eu estiver acionando essa consulta (ou seja, a data de ontem) para cadaBUYER_ID
.
Então para issoBUYER_ID
- 34512201
Eu preciso de 10 mais recorde para cadaBUYER_ID
base emCREATED_TIME
para a data de ontem apenas.
E cadaBUYER_ID
pode ter dados de qualquer dia. Mas estou especificamente interessado por um dia antes dos dados de hoje (significa a data de ontem sempre) verificando noCREATED_TIME
EncontrarTOP 10
dados mais recentes para cadaBUYER_ID
para a data de ontem. Abaixo está a saída de amostra que eu deveria estar correspondendo a cadaBUYER_ID
.
Exemplo de saída.
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
Estou trabalhando comHive
eHive
suporta sintaxe semelhante a SQL. Portanto, preciso garantir que o SQL também funcione no ambiente do Hive.
Alguém pode me ajudar com isso?
Atualizar:-
Estou usando a consulta abaixo e preciso obter o top 10 mais recente da consulta abaixo e preciso adicionar mais um qualificador para verificação de data, significawhere clause for yesterday's date
- eu não posso usarTOP 10
aqui como o Hive não suportaTOP 10
sintaxe sql. Eu preciso de outra maneira de fazer esse problema.
SELECT * FROM TestingTable1 WHERE ORDER BY buyer_id, created_time DESC;
Mais uma atualização: -
Eu escrevi esta consulta abaixo com o uso deRANK 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;
E esta é a função UDF RANK em Java
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++;
}
}
E acima de consulta não é o trabalho do jeito que eu queria, algum tipo de torção tem que ser feito eu acho que nessa consulta.
Existe alguma maneira de fazer isso sem usar qualquer UDF no HiveQL?