2012-04-06 27 views
6

Tôi đang cố gắng học Hive. Đáng ngạc nhiên, tôi không thể tìm thấy một ví dụ về cách viết một công việc đếm từ đơn giản. Có đúng không?Chương trình đếm từ trong Hive

Hãy nói rằng tôi có một tập tin đầu vào input.tsv:

hello, world 
this is an example input file 

tôi tạo một splitter bằng Python để biến mỗi dòng vào dòng chữ:

import sys 

for line in sys.stdin: 
for word in line.split(): 
    print word 

Và sau đó tôi đã sau trong script Hive của tôi :

CREATE TABLE input (line STRING); 
LOAD DATA LOCAL INPATH 'input.tsv' OVERWRITE INTO TABLE input; 

-- temporary table to hold words... 
CREATE TABLE words (word STRING); 

add file splitter.py; 

INSERT OVERWRITE TABLE words 
    SELECT TRANSFORM(text) 
    USING 'python splitter.py' 
    AS word 
    FROM input; 

SELECT word, count(*) AS count FROM words GROUP BY word; 

Tôi không chắc chắn nếu tôi thiếu thứ gì đó, hoặc nếu nó thực sự là thi s phức tạp. (Trong đó, tôi có cần phải tạm thời words bảng, và tôi cần phải viết các chức năng tách bên ngoài?)

Trả lời

12

Nếu bạn muốn có một đơn giản thấy như sau:

SELECT word, COUNT(*) FROM input LATERAL VIEW explode(split(text, ' ')) lTable as word GROUP BY word; 

tôi sử dụng một cái nhìn bên để cho phép sử dụng một hàm có giá trị bảng (phát nổ), nó lấy danh sách đi ra khỏi hàm tách và xuất ra một hàng mới cho mọi giá trị. Trong thực tế, tôi sử dụng một UDF để kết thúc trình ngắt dòng ICU4J của IBM. Tôi thường không sử dụng các kịch bản biến đổi và sử dụng UDF cho mọi thứ. Bạn không cần một bảng từ tạm thời.

+0

nhìn vào nhận xét của bạn liên quan đến phát nổ và xem bên trong HiveQL, bạn có thể vui lòng có một cái nhìn vào SO câu hỏi này, tôi không thể tìm ra giải pháp cho rằng, [http: // stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive] (http://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive). Rất tiếc vì đã liên hệ với bạn như thế này. – ferhan

+0

@Steve - Tôi đã tải dữ liệu vào một bảng và khi tôi chạy lệnh tôi nhận được 'FAILED: Lỗi trong phân tích ngữ nghĩa: null'. Có bất kỳ điều kiện tiên quyết nào để chạy lệnh không? –

2
CREATE TABLE docs (line STRING); 
LOAD DATA INPATH 'text' OVERWRITE INTO TABLE docs; 
CREATE TABLE word_counts AS 
SELECT word, count(1) AS count FROM 
(SELECT explode(split(line, '\s')) AS word FROM docs) w 
GROUP BY word 
ORDER BY word; 
1

Bạn có thể câu được xây dựng trong UDF trong tổ ong như sau:

1) Bước 1: Tạo một bảng tạm thời với một cột duy nhất tên là câu của kiểu dữ liệu mảng

create table temp as select sentence from docs lateral view explode(explode(sentences(lcase(line)))) ltable as sentence

2) Bước 2: Chọn từ của bạn từ bảng tạm thời một lần nữa phát nổ câu cột

select words,count(words) CntWords from 
 
(
 
select explode(words) words from temp 
 
) i group by words order by CntWords desc

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