2013-04-29 37 views
9

Tôi đang phải đối mặt với một lỗiHive Query- Tham gia hai bảng trên ba gia nhập điều kiện với toán tử OR

"FAILED: Error in semantic analysis: Line 1:101 OR not supported in JOIN currently dob"

khi chạy truy vấn dưới đây đề cập ..

Insert Overwrite Local Directory './Insurance_Risk/Merged_Data' Select f.name,s.age,f.gender,f.loc,f.marital_status,f.habits1,f.habits2,s.employement_status,s.occupation_class,s.occupation_subclass,s.occupation from sample_member_detail s Join fb_member_detail f 
On s.email=f.email or 
s.dob=f.dob 
or (f.name=s.name and f.loc = s.loc and f.occupation=s.occupation) 
where s.email is not null and f.email is not null; 

thể ai nói tôi rằng, trong hive "OR" nhà điều hành có thể được sử dụng hay không? nếu không, thì truy vấn nào sẽ là kết quả tương tự như được đưa ra bởi truy vấn được đề cập ở trên. Tôi có 2 bảng và tôi muốn tham gia hai bảng trên bất kỳ một trong ba điều kiện với hoặc điều hành. Hãy giúp đỡ ..

Trả lời

7

Xin lỗi, Hive chỉ hỗ trợ equi-join. Bạn luôn có thể cố gắng lựa chọn tuyệt vời đầy đủ sản phẩm Descartes của những bảng (bạn phải ở chế độ không nghiêm ngặt):

Select f.name,s.age,f.gender,f.loc,f.marital_status,f.habits1,f.habits2,s.employement_status,s.occupation_class,s.occupation_subclass,s.occupation 
from sample_member_detail s join fb_member_detail f 
where (s.email=f.email 
or s.dob=f.dob 
or (f.name=s.name and f.loc = s.loc and f.occupation=s.occupation)) 
and s.email is not null and f.email is not null; 
5

Bạn cũng có thể sử dụng UNION để có được kết quả tương tự:

INSERT OVERWRITE LOCAL DIRECTORY './Insurance_Risk/Merged_Data' 
-- You can only UNION on subqueries 
SELECT * FROM (
    SELECT f.name, 
     s.age, 
     f.gender, 
     f.loc, 
     f.marital_status, 
     f.habits1, 
     f.habits2, 
     s.employement_status, 
     s.occupation_class, 
     s.occupation_subclass, 
     s.occupation 
    FROM sample_member_detail s 
    JOIN fb_member_detail f 
    ON s.email=f.email 
    WHERE s.email IS NOT NULL AND f.email IS NOT NULL; 

    UNION 

    SELECT f.name, 
     s.age, 
     f.gender, 
     f.loc, 
     f.marital_status, 
     f.habits1, 
     f.habits2, 
     s.employement_status, 
     s.occupation_class, 
     s.occupation_subclass, 
     s.occupation 
    FROM sample_member_detail s 
    JOIN fb_member_detail f 
    ON s.dob=f.dob 
    WHERE s.email IS NOT NULL AND f.email IS NOT NULL; 

    UNION 

    SELECT f.name, 
     s.age, 
     f.gender, 
     f.loc, 
     f.marital_status, 
     f.habits1, 
     f.habits2, 
     s.employement_status, 
     s.occupation_class, 
     s.occupation_subclass, 
     s.occupation 
    FROM sample_member_detail s 
    JOIN fb_member_detail f 
    ON f.name=s.name AND f.loc = s.loc AND f.occupation=s.occupation 
    WHERE s.email IS NOT NULL AND f.email IS NOT NULL; 

) subquery; 
+1

bạn sẽ phải thêm _distinct_ ở cấp ngoài để có cùng kết quả. Nếu không, bạn sẽ nhận được bản sao của các hàng đáp ứng nhiều điều kiện. –

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