2012-07-10 1 views
3

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?

+2

Vous devriez dire précisément quelle langue SQL que vous utilisez. – mawburn

+1

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

+0

@Bohemian, Une idée de comment cela peut-il être fait? – ferhan

Répondre

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

Merci Frank pour commenter. Je ne suis pas spécifique à ce 'buyer_id'. Cela peut être beaucoup. Et je n'ai pas besoin de First 10. J'ai besoin de plus tard pour ce jour particulier. Par les derniers moyens 10 derniers temps pour ce 'BUYER_ID' particulier dans l'ordre décroissant – ferhan

+0

Depuis que vous avez donné cet exemple, je l'ai utilisé pour mon exemple :) .. bien, en ORDERing created_time en DESCENDANT, le premier 10 serait les 10 dernières lignes? ..ahh, pourquoi create_time n'est pas défini comme un type de données DATETIME? .. et si vous voulez un résultat des jours précédents, vous pouvez ajouter un qualificateur à la clause WHERE. –

+0

Je n'ai aucune idée pourquoi ils n'ont pas défini comme type de données 'DATETIME'. Je travaille sur le design de quelqu'un d'autre. Ils ont défini cela comme une chaîne. Donc je dois utiliser ça je suppose. J'ai également posté un exemple de sortie. – ferhan

Questions connexes