2011-06-17 48 views
7

Tôi có thể thực hiện các lựa chọn phụ trong Hive như thế nào? Tôi nghĩ rằng tôi có thể làm cho một sai lầm thực sự rõ ràng đó không phải là quá rõ ràng với tôi ...Truy vấn Hadoop Hive: Multi-join

Lỗi Tôi nhận: FAILED: Parse Error: line 4:8 cannot recognize input 'SELECT' in expression specification

Dưới đây là bảng ba nguồn của tôi:

aaa_hit -> [SESSION_KEY, HIT_KEY, URL] 
aaa_event-> [SESSION_KEY,HIT_KEY,EVENT_ID] 
aaa_session->[SESSION_KEY,REMOTE_ADDRESS] 

.. .và những gì tôi muốn làm là chèn kết quả vào bảng kết quả như sau:

result -> [url, num_url, event_id, num_event_id, remote_address, num_remote_address] 

... trong đó cột 1 là URL, cột 3 là 1 "sự kiện" hàng đầu trên mỗi URL và cột 5 là t anh ấy đứng đầu 1 REMOTE_ADDRESS để truy cập URL đó. (Ngay cả các cột là "đếm" s của cột trước đó.)

Soooooo ... tôi đã làm gì sai ở đây?

INSERT OVERWRITE TABLE result2 
SELECT url, 
     COUNT(url) AS access_url, 
     (SELECT events.event_id as evt, 
       COUNT(events.event_id) as access_evt 
     FROM aaa_event events 
       LEFT OUTER JOIN aaa_hit hits 
       ON (events.hit_key = hit_key) 
       ORDER BY access_evt DESC LIMIT 1), 
     (SELECT sessions.remote_address as remote_address, 
       COUNT(sessions.remote_address) as access_addr 
     FROM aaa_session sessions 
       RIGHT OUTER JOIN aaa_hit hits 
       ON (sessions.session_key = session_key) 
       ORDER BY access_addr DESC LIMIT 1) 
FROM aaa_hit 
ORDER BY access_url DESC; 

Cảm ơn bạn rất nhiều :)

+0

Lỗi nào là tổ chức cung cấp cho bạn? Hive đưa ra một lỗi khá hữu ích và vị trí chính xác trong truy vấn gây ra sự cố. Điều đó sẽ cho phép bạn xem xét vị trí chính xác trong truy vấn gây ra sự cố hoặc để chúng tôi có thể. – Nija

+0

Điểm tốt. Tôi nhận được một lỗi ở 4: 8, hoặc bắt đầu của câu lệnh SELECT đầu tiên. Cụ thể hơn: 'FAILED: Parse Error: dòng 4: 8 không thể nhận ra đầu vào 'SELECT' trong đặc tả biểu thức ' – batman

Trả lời

10

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries

Hive supports subqueries only in the FROM clause.

Bạn không thể sử dụng một subquery như một 'cột' trong Hive.

Để giải quyết vấn đề này, bạn sẽ muốn sử dụng truy vấn con đó trong mệnh đề FROM và JOIN cho nó. (bên dưới sẽ không hoạt động, nhưng là ý tưởng)

SELECT url, 
     COUNT(url) AS access_url, 
     t2.col1, t2.col2 ... 
FROM aaa_hit 
JOIN (SELECT events.event_id as evt, 
       COUNT(events.event_id) as access_evt 
     FROM aaa_event events 
       LEFT OUTER JOIN aaa_hit hits 
       ON (events.hit_key = hit_key) 
       ORDER BY access_evt DESC LIMIT 1), 
     (SELECT sessions.remote_address as remote_address, 
       COUNT(sessions.remote_address) as access_addr 
     FROM aaa_session sessions 
       RIGHT OUTER JOIN aaa_hit hits 
       ON (sessions.session_key = session_key) 
       ORDER BY access_addr DESC LIMIT 1) t2 
ON (aaa_hit.THING = t2.THING) 

Kiểm tra https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins để biết thêm thông tin về cách sử dụng JOIN trong Hive.

+0

Vậy tôi có phải tạo một bảng khác không? – batman

+1

Điều cần biết Tôi không thể làm điều này, nhưng làm thế nào tôi nên đi xung quanh nó? – batman

+0

@Travis Powell: đã thêm chi tiết – Nija

0

Bạn không có hoạt động GroupBy, Đếm là tập hợp. Chỉ đếm (*) hoạt động mà không có một mệnh đề GroupBy.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+GroupBy

+1

Trong khi liên kết này có thể trả lời câu hỏi, bạn không thể trả lời câu trả lời này bằng cách lấy các phần quan trọng của liên kết và đưa câu trả lời vào câu trả lời của bạn, điều này đảm bảo câu trả lời của bạn vẫn là câu trả lời nếu liên kết được thay đổi hoặc xóa :) – WhatsThePoint

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