2016-06-14 31 views
6

Sto confrontando il comportamento tra i motori SQL. Oracle ha il comportamento che ci si aspetta da un motore SQL per la piena join esterni:Perché il join esterno completo in HIVE dà risultati strani quando manca uno dei campi di join?

Oracle

CREATE TABLE sql_test_a 
( 
    ID   VARCHAR2(4000 BYTE), 
    FIRST_NAME VARCHAR2(200 BYTE), 
    LAST_NAME VARCHAR2(200 BYTE) 
); 

CREATE TABLE sql_test_b 
( 
    NUM   VARCHAR2(4000 BYTE), 
    FIRST_NAME VARCHAR2(200 BYTE), 
    LAST_NAME VARCHAR2(200 BYTE) 
); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('1', 'John', 'Snow'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson'); 


INSERT INTO sql_test_b (NUM, FIRST_NAME, LAST_NAME) VALUES ('20', 'Mike', 'Tyson'); 

Quando eseguo quanto segue, mi dà il risultato atteso. La tabella risultante contiene due righe, con una delle righe che contiene NULL per il campo NUM, perché non c'è neve di john nella tabella sql_test_b.

SELECT A.FIRST_NAME, A.LAST_NAME, A.ID, B.NUM 
FROM 
SQL_TEST_A A 
FULL OUTER JOIN 
SQL_TEST_B B 
ON 
A.FIRST_NAME = B.FIRST_NAME 
AND 
A.LAST_NAME = B.LAST_NAME; 

È possibile verificare lo script SQL qui: http://sqltest.net/

HIVE

In HIVE, tuttavia, se si dovesse provare la stessa cosa, il full outer join risultati in una tabella con due file . La riga che dovrebbe essere la riga "John Snow" contiene NULL per i campi FIRST_NAME, LAST_NAME e NUM. Il numero 1 è compilato per ID, ma il gioco è fatto.

Perché un comportamento così strano in HIVE? è un insetto? O mi manca qualcosa ... perché Oracle 11g sembra gestire questo molto meglio. Grazie.

+1

mysql non supporta full-outer-join, quindi come si ottiene il risultato corretto ?? – Farooque

+0

Suppongo che sia Oracle, non MySQL. Grazie @Farooque !! – Candic3

+0

È normale questo comportamento in HIVE? – Candic3

risposta

0

Credo problema con "(" dopo a condizione che è leggermente diverso rispetto SQL tradizionale.

 SELECT A.FIRST_NAME, A.LAST_NAME, A.ID, B.NUM 
       FROM 
        SQL_TEST_A A 
        FULL OUTER JOIN 
       SQL_TEST_B B ON 
      (A.FIRST_NAME = B.FIRST_NAME AND A.LAST_NAME = B.LAST_NAME); 
1

non ho potuto simulare il risultato riportato da @ Candic3

Ho usato le seguenti affermazioni insieme la stessa "selezionare" query nella questione.

CREATE TABLE IF NOT EXISTS sql_test_a (ID String, FIRST_NAME String, LAST_NAME String) COMMENT 'sql_test_a' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE; 


CREATE TABLE IF NOT EXISTS sql_test_b (NUM String, FIRST_NAME String, LAST_NAME String) COMMENT 'sql_test_b' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE; 


INSERT INTO sql_test_a VALUES ('1', 'John', 'Snow'); 
INSERT INTO sql_test_a VALUES ('2', 'Mike', 'Tyson'); 
INSERT INTO sql_test_b VALUES ('20', 'Mike', 'Tyson'); 

SELECT A.FIRST_NAME, A.LAST_NAME, A.ID, B.NUM 
FROM 
SQL_TEST_A A 
FULL OUTER JOIN 
SQL_TEST_B B 
ON 
A.FIRST_NAME = B.FIRST_NAME 
AND 
A.LAST_NAME = B.LAST_NAME; 

Si prega di trovare il risultato allegato.

0.123.

Tuttavia, selezionare query restituisce NULL a causa di errori secondari non notati come la mancata corrispondenza del tipo di dati tra il DDL ei dati effettivi (ad esempio, da file flat) o la mancata corrispondenza tra il delimitatore indicato nel DDL e quelli nei dati effettivi. Query_result

+0

Che cos'è un 'DDL'? – Candic3

+0

Leggere questo: http://stackoverflow.com/questions/2578194/what-is-ddl-and-dml – Marco99

Problemi correlati