Recueillir avec une Carte dans la Ruche
J'ai un tableau de la Ruche tels que
id | value
-------------
A 1
A 2
B 3
A 4
B 5
Essentiellement, je veux imiter Python defaultdict(list)
et de créer une carte avec id
que les clés et value
comme les valeurs.
Requête:
select COLLECT_TO_A_MAP(id, value)
from table
De sortie:
{A:[1,2,4], B:[3,5]}
J'ai essayé d'utiliser klout est CollectUDAF()
mais il semble que ce ne sera pas ajouter les valeurs dans un tableau, il suffit de les mettre à jour. Des idées?
EDIT:
Voici une description plus détaillée afin que je puisse éviter les réponses de référencement que j'essaie de fonctions dans la Ruche de la documentation. Supposons que j'ai une table
num |id |value
____________________
1 A 1
1 A 2
1 B 3
2 A 4
2 B 5
2 B 6
Ce que je cherche, c'est pour un udaf, nous fournit cette sortie
num |new_map
________________________
1 {A:[1,2], B:[3]}
2 {A:[4], B:[5,6]}
À cette requête
select num
,COLLECT_TO_A_MAP(id, value) as new_map
from table
group by num
Il y a une solution pour y parvenir. Il peut être imité en utilisant Klout est (voir ci-dessus référencé udaf, nous) CollectUDAF()
dans une requête telle que
add jar '~/brickhouse/target/brickhouse-0.6.0.jar'
create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';
select num
,collect(id_array, value_array) as new_map
from (
select collect_list(id) as id_array
,collect_list(value) as value_array
,num
from table
group by num
) A
group by num
Cependant, je préfère ne pas écrire une requête imbriquée.
EDIT #2
(Comme mentionné dans ma question d'origine) j'ai déjà essayé d'utiliser Klout est CollectUDAF()
, même dans le cas où vous passez deux paramètre et il crée une carte. La sortie de ce qui est (si elle est appliquée à l'ensemble de données dans ma 1ère edition)
1 {A:2, B:3}
2 {A:4, B:6}
Comme indiqué dans ma question initiale, il ne collectionne pas les valeurs d'un tableau, il juste recueille le dernier (ou met à jour le tableau).
OriginalL'auteur gobrewers14 | 2014-07-18
Vous devez vous connecter pour publier un commentaire.
Utiliser la collecte de l'UDF, en Brickhouse (http://github.com/klout/brickhouse )
C'est exactement ce dont vous avez besoin. Brickhouse "collect" renvoie une liste si un paramètre est utilisé, et une carte, si les deux paramètres sont utilisés.
OriginalL'auteur Jerome Banks
la CollectUDAF dans Brickhouse (http://github.com/klout/brickhouse ) vous y arrivez.
ce qui concerne votre commentaire EDIT #2:
tout d'abord, recueillir les valeurs d'une liste, puis recueillir le k,v des paires de carte:
sera de retour
votre requête dans EDIT1 n'était pas tout à fait correct. si vous voulez le faire sans une requête imbriquée, alors vous devrez probablement créer votre propre udaf, nous, à l'aide de l'un de ceux déjà existants. Devrait être assez simple. En dehors de cela je suis tout à fait sûr qu'il n'y a aucun moyen de le faire à la vanille de la ruche sans une requête imbriquée à l'heure actuelle.
OriginalL'auteur Clemens Valiente
Si vous n'avez pas de soins sur l'ordre dans lequel les valeurs sont affichées, vous pouvez utiliser le collect_set() udaf, nous qui vient avec la Ruche.
Cela devrait résoudre votre problème.
À partir de la documentation,
collect_set
retourne unarray
pas une carte.OriginalL'auteur Nishant Kelkar
Votre requête actuelle des groupes de num à la fois l'intérieur et l'extérieur de la requête -- vous avez besoin de regrouper par
id
dans la requête interne pour accomplir ce que vous essayez de faire.OriginalL'auteur dscheffy
https://github.com/klout/brickhouse/blob/master/src/main/java/brickhouse/udf/collect/CollectUDAF.java#L55
voir brickhouse udaf, nous,quand args num de plus de 1, MapCollectUDAFEvaluator serait utilisé.
OriginalL'auteur Trucy Luce