2010-11-01 31 views
28

Je suis à la recherche d'une fonction de split String intégrée dans Hive? E.g. si la chaîne estEst-ce que Hive a une fonction de séparation de chaînes?

A | B | C | D | E

alors je veux avoir une fonction comme split (entrée de chaîne, delimiter char) tableau

pour que je reviens [A, B, C, D, E].

Une telle fonction de division intégrée existe-t-elle dans Hive. Je ne peux voir que regexp_extract et regexp_replace. J'aimerais voir une fonction de chaîne indexOf() et split() .

Merci

Ajay

Répondre

37

Il existe bien une fonction de répartition basée sur les expressions régulières. Il n'est pas répertorié in the tutorial, mais il est coté sur the language manual on the wiki:

split(string str, string pat) 
    Split str around pat (pat is a regular expression) 

Dans votre cas, le séparateur « | » a une signification particulière comme une expression régulière, il devrait donc être appelé « \\| ».

+1

et ce avec virgule? Quand j'utilise '\\;' ruche voir ici EOF ... – herder

+0

Le point-virgule n'est pas dans la liste des métacaractères regex (voir, par exemple, https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php). Ainsi, vous devriez simplement pouvoir utiliser ';' au lieu de '\\;'. –

29

Une autre usecase intéressante pour la fente de la Ruche est quand, par exemple, une colonne ipname dans le tableau a une valeur « abc11.def.ghft.com » et que vous voulez tirer « ABC11 » out:

SELECT split(ipname,'[\.]')[0] FROM tablename; 
+1

est le split peut utiliser dans 'GROUP BY' comme' select split (zone, '[_]') [0], isp, pc_mobile, périphérique, count (userip) de usemap_without_ptime ORDER BY split (zone, '[_] ') [0], isp, pc_mobile, device' – timger

+1

En fait, vous devez mettre le motif dans une regex. devrait être SELECT split (ipname, '\\.') [0] FROM nom de table – Marlio

0

Juste une précision sur la réponse donnée par Bkkbrad.

J'ai essayé cette suggestion et cela n'a pas fonctionné pour moi.

Par exemple,

split('aa|bb','\\|') 

produit:

["","a","a","|","b","b",""] 

Mais,

split('aa|bb','[|]') 

a produit le résultat souhaité:

["aa","bb"] 

Y compris le métacaractère '|' à l'intérieur des crochets fait en sorte qu'il soit interprété littéralement, comme prévu, plutôt que comme un métacaractère.

Pour l'élaboration de ce comportement de regexp, voir: http://www.regular-expressions.info/charclass.html