Voici le tableau ci-dessousTrouver TOP 10 dernier disque pour chaque BUYER_ID pour la date d'hier
CREATE TABLE IF NOT EXISTS TestingTable1
(
BUYER_ID BIGINT,
ITEM_ID BIGINT,
CREATED_TIME STRING
)
Et voici les données ci-dessous dans la table- ci-dessus
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,
Si vous voyez les données ci-dessus dans la table, il n'y a que deux UNIQUE BUYER_ID
et correspondant à ceux que j'ai ITEM_ID
ET CREATED_TIME
. Je n'ai besoin que de 10 derniers enregistrements sur la base de l'heure de la veille de la date d'aujourd'hui chaque fois que je déclencherai cette requête (c'est-à-dire la date d'hier) pour chaque BUYER_ID
.
Donc, pour ce BUYER_ID
-34512201
J'ai besoin 10 derniers enregistrements pour chaque base BUYER_ID
sur CREATED_TIME
pour la date d'hier seulement.
Et chaque BUYER_ID
peut avoir n'importe quelle donnée de jour. Mais je suis particulièrement intéressé par jour avant les données d'aujourd'hui (ce qui signifie la date d'hier toujours) en vérifiant au CREATED_TIME
Trouver TOP 10
dernières données pour chaque BUYER_ID
pour la date d'hier. Ci-dessous l'exemple de sortie que je devrais obtenir correspondant à BUYER_ID
.
Exemple de sortie.
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
Je travaille avec Hive
et Hive
prend en charge SQL comme la syntaxe. Donc je dois m'assurer que le SQL devrait fonctionner aussi dans l'environnement Hive.
Quelqu'un peut-il m'aider avec ceci?
Mise à jour: -
J'utilise la requête ci-dessous et je dois obtenir le top 10 des dernières nouvelles de la requête ci-dessous et le besoin d'ajouter un qualificatif pour la vérification de la date, signifie where clause for yesterday's date
- Je ne peux pas utiliser TOP 10
ici comme Hive ne supporte pas la syntaxe TOP 10
sql. J'ai besoin d'un autre moyen de faire ce problème.
SELECT * FROM TestingTable1 WHERE ORDER BY buyer_id, created_time DESC;
One More MISE À JOUR: -
J'ai écrit cette requête avec ci-dessous l'utilisation de 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;
Et c'est les fonctions RANG UDF dans 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++;
}
}
Et surtout requête est fonctionne pas la façon dont je voulais, une sorte de torsion doit être fait, je suppose que dans cette requête.
Y at-il un moyen de le faire sans utiliser UDF dans HiveQL?
Vous devriez dire précisément quelle langue SQL que vous utilisez. – mawburn
Je travaille avec Hive et Hive supporte la syntaxe SQL Like, donc c'est la raison pour laquelle je marque cette question comme 'SQL'. Je pense que la syntaxe d'Oracle fonctionnera bien ici. – ferhan
@Bohemian, Une idée de comment cela peut-il être fait? – ferhan