2010-11-01 42 views
28

Tôi đang tìm kiếm một chức năng tách chuỗi trong xây dựng trong Hive? Ví dụ: nếu String làHive có chức năng tách chuỗi không?

A | B | C | D | E

sau đó tôi muốn có một chức năng như mảng split (string input, char delimiter)

vì vậy mà tôi có được trở lại [A, B, C, D, E].

Có một chức năng phân tách được tạo sẵn như vậy tồn tại trong Hive hay không. Tôi chỉ có thể xem regexp_extract và regexp_replace. Tôi rất thích xem các hàm chuỗi indexOf() và split() .

Cảm ơn

Ajay

Trả lời

37

Có tồn tại một chức năng phân chia dựa trên biểu thức thông thường. Nó không được liệt kê in the tutorial, nhưng nó được niêm yết trên the language manual on the wiki:

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

Trong trường hợp của bạn, dấu phân cách "|" có một ý nghĩa đặc biệt như một biểu hiện thường xuyên, vì vậy nó nên được gọi là "\\|".

+1

và dấu chấm phẩy là gì? Khi tôi sử dụng '\\;' hive xem ở đây EOF ... – herder

+0

dấu chấm phẩy không có trong danh sách các siêu ký tự regex (xem, ví dụ: https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php). Vì vậy, bạn chỉ nên có thể sử dụng ';' thay vì '\\;'. –

29

Một usecase thú vị cho sự chia rẽ trong Hive là khi nào, ví dụ, một cột ipname trong bảng có giá trị "abc11.def.ghft.com" và bạn muốn kéo "abc11" ra:

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

là phần tách có thể sử dụng trong 'GROUP BY' như' select split (khu vực, '[_]') [0], isp, pc_mobile, thiết bị, đếm (userip) từ usemap_without_ptime ORDER BY split (area, '[_] ') [0], isp, pc_mobile, device' – timger

+1

Thực ra bạn phải đặt mẫu trong regex. nên được SELECT tách (ipname, '\\.') [0] FROM tablename – Marlio

0

Chỉ cần làm rõ câu trả lời của Bkkbrad.

Tôi đã thử đề xuất này và nó không hoạt động đối với tôi.

Ví dụ,

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

sản xuất:

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

Nhưng,

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

sản xuất các kết quả mong muốn:

["aa","bb"] 

Bao gồm cả metacharacter '|' bên trong dấu ngoặc vuông làm cho nó được hiểu theo nghĩa đen, như dự định, chứ không phải là một siêu ký tự.

Để xây dựng hành vi này của regexp, hãy xem: http://www.regular-expressions.info/charclass.html

Các vấn đề liên quan