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.
mysql non supporta full-outer-join, quindi come si ottiene il risultato corretto ?? – Farooque
Suppongo che sia Oracle, non MySQL. Grazie @Farooque !! – Candic3
È normale questo comportamento in HIVE? – Candic3