2010-11-01 19 views
28

Sto cercando una funzione String split integrata in Hive? E.g. se la stringa èHive ha una funzione di suddivisione stringa?

A | B | C | D | E

poi voglio avere una funzione come array di split (stringa di input, delimitatori char)

in modo che torno [A, B, C, D, E].

Esiste una funzione di divisione incorporata nell'hive. Posso solo vedere regexp_extract e regexp_replace. Mi piacerebbe vedere le funzioni stringa indexOf() e split() .

Grazie

Ajay

risposta

37

vi esiste una funzione di Spalato sulla base di espressioni regolari. Non è elencato in the tutorial, ma è quotata the language manual on the wiki:

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

Nel tuo caso, il delimitatore "|" ha un significato speciale come un'espressione regolare, quindi dovrebbe essere indicato come "\\|".

+1

e quello che con il punto e virgola? Quando uso '\\;' hive vedi qui EOF ... – herder

+0

punto e virgola non è nella lista dei metacaratteri regex (vedi, ad esempio, https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php). Quindi, dovresti essere in grado di usare ';' invece di '\\;'. –

29

Un altro caso d'uso interessante per la spaccatura in Hive è quando, ad esempio, una colonna ipname nella tabella ha un valore "abc11.def.ghft.com" e si vuole tirare "ABC11" out:

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

è lo split può usare in 'GROUP BY' come' seleziona split (area, '[_]') [0], isp, pc_mobile, device, count (userip) da usemap_without_ptime ORDER BY split (area, '[_] ') [0], isp, pc_mobile, device' – timger

+1

In realtà devi inserire il pattern in un'espressione regolare. dovrebbe essere SELECT split (ipname, '\\.') [0] FROM tablename – Marlio

0

Solo un chiarimento sulla risposta data da Bkkbrad.

Ho provato questo suggerimento e non ha funzionato per me.

Ad esempio,

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

prodotto:

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

Ma,

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

prodotto il risultato desiderato:

["aa","bb"] 

Compreso il metacarattere '|' all'interno delle parentesi quadre ne viene interpretato letteralmente, come previsto, piuttosto che come un metacarattere.

per l'elaborazione di questo comportamento di regexp, vedi: http://www.regular-expressions.info/charclass.html