2010-11-01 22 views
28

Estoy buscando una función de división de cadenas integrada en Hive? P. ej. si la cadena es¿Hive tiene una función de división de cadenas?

A | B | D | D | E

entonces yo quiero tener una función como array dividido (entrada de cadena, char delimitador)

para que regrese [A, B, C, D, E].

¿Existe una función dividida integrada en Hive? Solo puedo ver regexp_extract y regexp_replace. Me encantaría ver un indexOf() y split() funciones de cadena.

Gracias

Ajay

Respuesta

37

sí que existe una función de división basado en expresiones regulares. No aparece en la lista in the tutorial, pero aparece en the language manual on the wiki:

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

En su caso, el delimitador "|" tiene un significado especial como una expresión regular, por lo que deben ser referidos como "\\|".

+1

y qué con punto y coma? Cuando uso '\\;' colmena ver aquí EOF ... – herder

+0

punto y coma no está en la lista de metacaracteres de expresiones regulares (consulte, por ejemplo, https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php). Por lo tanto, solo deberías poder usar ';' en lugar de '\\;'. –

29

Otro caso de uso interesante para la división en la colmena es cuando, por ejemplo, una columna de ipname de la tabla tiene un valor "abc11.def.ghft.com" y quiere tirar "ABC11" fuera:

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

es la división se puede usar en 'GROUP BY' como' select split (area, '[_]') [0], isp, pc_mobile, device, count (userip) de usemap_without_ptime ORDER BY split (area, '[_] ') [0], isp, pc_mobile, device' – timger

+1

En realidad, tienes que poner el patrón en una expresión regular. debe ser SELECCIONAR split (nombre de IP, '\\.') [0] FROM tablename – Marlio

0

Solo una aclaración sobre la respuesta dada por Bkkbrad.

Intenté esta sugerencia y no funcionó para mí.

Por ejemplo,

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

fabricados:

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

Pero,

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

produce el resultado deseado:

["aa","bb"] 

Incluyendo el metacarácter '|' dentro de los corchetes hace que se interprete literalmente, como se pretende, en lugar de como un metacarácter.

Para la elaboración de este comportamiento de las expresiones regulares, consulte: http://www.regular-expressions.info/charclass.html

Cuestiones relacionadas