2012-10-22 5 views
1

Je suis en train de faire correspondre les numéros de téléphone à une zone en utilisant Ruche. J'ai une table (PREFMAP) qui associe un préfixe du numéro (préfixe) dans une zone (zone) et une autre table (utilisateurs) avec une liste de numéros de téléphone (nb). Il y a seulement 1 correspondance par numéro de téléphone (pas de sous-région)2 tables à Hive en utilisant un numéro de téléphone et un préfixe (longueur variable)

Le problème est que la longueur des préfixes ne fixe donc je ne peux pas utiliser la fonction UDF substr (nb, « la longueur du préfixe ») dans les JOIN de ON() condition pour faire correspondre la sous-chaîne d'un nombre à un préfixe.

Et quand je tente d'utiliser instr() pour trouver si un numéro a un préfixe correspondant:

SELECT users.nb,prefix.area 
FROM users 
LEFT OUTER JOIN prefix 
ON (instr(prefmap.prefix,users.nb)=1) 

je reçois une erreur sur line4 « Les deux gauche et alias droite rencontrés Rejoindre « 1 »)

Comment pourrais-je obtenir ce travail J'utilise la ruche 0.9 Merci pour tout conseil

Répondre

4

Probablement pas la meilleure solution, mais au moins il fait le travail:. utilisation Où définir le conditi correspondant au lieu de ON() (qui est maintenant forcé à TRUE)

select users.nb, prefix.area 
from users 
LEFT OUTER JOIN prefix 
ON(true) 
WHERE instr(users.nb,prefmap.prefix)=1 

Ce n'est pas parfait, car il est un peu lent. Il crée autant d'entrées temporaires (inutiles) qu'il y en a dans la table correspondante avant que la condition WHERE ne conserve la bonne. Il est donc préférable de ne l'utiliser que si ce n'est pas trop long. Quelqu'un peut-il penser à une meilleure façon de le faire? ruche

+0

Malheureusement, je pense que c'est une meilleure solution pour ce cas, car tous les matchs doivent être essayés avec l'udf afin de tester l'égalité et de rejeter –

+0

Je prends cela, il semble que cela puisse être fait, écrire un udf personnalisé, qui prend vos 2 entrées, par exemple customudf (users.nb, prefmap.prefix), effectue votre comparaison instr (users.nb, prefmap.prefix) = 1 et renvoie true. Réponse a été trouvée ici: http://stackoverflow.com/questions/18039235/joining-two-tables-on-a-udf-in-hive –

1

ne peut pas convertir (instr(prefmap.prefix,users.nb)=1) à MapReduce emploi.

ruche afin rejoignons soutiennent simplement l'expression de l'égalité. Voir hive joins wiki pour plus d'informations.

+0

lien mort, pense que c'est la nouvelle page: https: //cwiki.apache .org/confluence/écran/Hive/LanguageManual + Jointures –

+0

thxs, j'ai mis à jour. – pensz

Questions connexes