web-dev-qa-db-fra.com

Hive a-t-il une fonction de partage de chaîne?

Je recherche une fonction de partage de chaîne intégrée dans Hive? Par exemple. si String est

A | B | C | D | E

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

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

Existe-t-il une telle fonction de division intégrée dans Hive? Je ne peux voir que regexp_extract et regexp_replace. J'aimerais voir les fonctions de chaîne indexOf () et split ().

Merci

Ajay

39
user855

Il existe une fonction de division basée sur des expressions régulières. Il n'est pas répertorié dans le tutoriel , mais il est répertorié sur le manuel de langue sur le wiki :

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

Dans votre cas, le délimiteur "| "a une signification particulière en tant qu'expression régulière, il doit donc être appelé" \\| ".

50
Bkkbrad

Un autre cas d'utilisation intéressant pour la division dans Hive est lorsque, par exemple, une colonne ipname dans le tableau a une valeur "abc11.def.ghft.com" et que vous souhaitez retirer "abc11":

SELECT split(ipname,'[\.]')[0] FROM tablename;
38
Sanjay Subramanian

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','[|]')

produit le résultat souhaité:

["aa","bb"]

Y compris le métacaractère "|" à l'intérieur des crochets, il est 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

6
spelunk1