2013-04-29 17 views
9

Jestem stoi błądHive Query- Łączenie dwóch tabel na trzech warunków łączenia z lub operatora

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

podczas wykonywania niżej wymienionych zapytanie ..

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; 

Może ktoś powiedzieć mnie, że w ulu "OR" można użyć operatora, czy nie? jeśli nie, to jakie powinno być zapytanie, które da taki sam wynik, jak podane przez powyższe zapytanie. Mam 2 tabele i chcę dołączyć do dwóch tabel na jednym z trzech warunków z lub operatora. Proszę pomóc ..

Odpowiedz

7

Niestety Hive obsługuje tylko equi-joins. Zawsze można spróbować wybrać z pełnej iloczyn kartezjański tych tabel (musisz być w trybie non-ścisłym):

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

Można również użyć UNION aby uzyskać takie same wyniki:

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

byś aby uzyskać takie same wyniki, musisz dodać _distinct_ na poziomie zewnętrznym. W przeciwnym razie otrzymasz duplikaty wierszy spełniających wiele warunków. –

Powiązane problemy