Obtenir un numéro d'ordre d'un rang au sein d'une partition sans l'aide de la fonction ROW_NUMBER() OVER fonction
J'ai besoin de classer les lignes de la partition (ou le groupe), c'est à dire si ma table source est:
NAME PRICE
---- -----
AAA 1.59
AAA 2.00
AAA 0.75
BBB 3.48
BBB 2.19
BBB 0.99
BBB 2.50
Je tiens à mettre la table cible:
RANK NAME PRICE
---- ---- -----
1 AAA 0.75
2 AAA 1.59
3 AAA 2.00
1 BBB 0.99
2 BBB 2.19
3 BBB 2.50
4 BBB 3.48
Normalement, je voudrais utiliser ROW_NUMBER() OVER
fonction, donc dans Apache Hive, il serait:
select
row_number() over (partition by NAME order by PRICE) as RANK,
NAME,
PRICE
from
MY_TABLE
;
Malheureusement Cloudera Impala ne prend pas en charge (pour le moment) ROW_NUMBER() OVER
fonction, donc je suis à la recherche d'une solution de contournement. De préférence, ne pas utiliser udaf, nous, comme il sera politiquement difficile à convaincre de le déployer sur le serveur.
Merci pour votre aide.
Analytique des fonctions de la fenêtre sont une priorité et le développement est en cours. Restez à l'écoute pour une sortie prochaine de l'ajout de cette fonctionnalité dans le cadre de la feuille de route pour l'Impala 2.0.
OriginalL'auteur Andrey Dmitriev | 2014-05-02
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas faire avec une sous-requête corrélée, vous pouvez toujours le faire avec une jointure:
Noter que ce n'est pas exactement faire
row_number()
sauf tous les prix sont distincts pour unname
. Cette formulation est en fait équivalent àrank()
.Pour
row_number()
, vous avez besoin d'un identificateur unique de ligne.Par le chemin, la suite est équivalente à
dense_rank()
:OriginalL'auteur Gordon Linoff
L'habitude solution de contournement pour les systèmes en ne soutenant pas les fonctions de la fenêtre est quelque chose comme ceci:
SQLFiddle exemple: http://sqlfiddle.com/#!2/3b027/2
OriginalL'auteur a_horse_with_no_name
Pas vraiment une réponse pour comment avec Impala, mais il y a d'autres SQL sur Hadoop solutions qui ne analytique et de la sous-requête des options déjà. Sans ces capacités, vous allez probablement avoir à compter sur les multiples étapes d'un processus ou certaines udaf, nous.
Je suis un architecte pour InfiniDB
InfiniDB prend en charge des fonctions analytiques et les sous-requêtes.
http://infinidb.co
Découvrez Requête 8 dans l'indice de référence de Radiant Conseillers, c'est un style similaire de la requête que vous êtes après, en utilisant rang analytique de la fonction. Presto est également en mesure d'exécuter cette requête de style, mais à un rythme plus lent (80x) rythme
http://radiantadvisors.com/wp-content/uploads/2014/04/RadiantAdvisors_Benchmark_SQL-on-Hadoop_2014Q1.pdf
La requête à partir de l'indice de référence (question 8)
Résultats
OriginalL'auteur mhoglan