2010-11-01 6 views
28

Ich bin auf der Suche nach einer integrierten String Split-Funktion in Hive? Zum Beispiel wenn String istHat Hive eine String-Split-Funktion?

A | B | C | D | E

dann möchte ich eine Funktion wie Array Split haben (String-Eingang, char Begrenzer)

, so dass ich wieder [A, B, C, D, E].

Gibt es eine solche integrierte Split-Funktion in Hive. Ich kann nur regexp_extract und regexp_replace sehen. Ich würde gerne eine indexOf() und split() String-Funktionen sehen.

Dank

Ajay

Antwort

37

tut es eine Split-Funktion basierend auf regulären Ausdrücken bestehen. Es ist nicht in the tutorial aufgeführt, aber es ist an the language manual on the wiki:

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

In Ihrem Fall des Trennzeichen „|“ hat eine besondere Bedeutung als regulären Ausdruck, so sollte es als „\\|“ bezeichnet.

+1

und was mit Semikolon? Wenn ich '\\' verwende Bienenstock siehe hier EOF ... – herder

+0

Semikolon ist nicht in der Liste der Regex Metazeichen (siehe z. B. https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php). Daher sollten Sie einfach ';' verwenden können. Anstatt von '\\;'. –

29

Eine weitere interessante usecase für Split in Hive ist, wenn zum Beispiel eine Spalte ipname in der Tabelle einen Wert „abc11.def.ghft.com“ hat und Sie wollen „ABC11“ herausziehen:

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

ist der Split kann in 'GROUP BY' wie' select split (Bereich, '[_]') [0], isp, pc_mobile, device, count (userip) von usemap_without_ptime ORDER BY split (Bereich, '[_] ') [0], isp, pc_mobile, device' – timger

+1

Eigentlich müssen Sie das Muster in eine Regex setzen. sollte SELECT split (ipname, '\\.') [0] FROM Tabellenname sein – Marlio

0

Nur eine Erläuterung zu der Antwort von Bkkbrad gegeben.

Ich habe diesen Vorschlag versucht und es hat nicht für mich funktioniert.

Zum Beispiel

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

hergestellt:

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

Aber

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

das gewünschte Ergebnis erzeugt:

["aa","bb"] 

Einschließlich des Metazeichens '|' Innerhalb der eckigen Klammern bewirkt es, dass es wörtlich wie beabsichtigt interpretiert wird und nicht als Metazeichen.

Für Ausarbeitung dieses Verhalten von regexp finden Sie unter: http://www.regular-expressions.info/charclass.html