当其中一个连接字段丢失时,为什么HIVE中的完全外连接会产生奇怪的结果?

Can*_*ic3 7 null hadoop hive oracle11g full-outer-join

我正在比较SQL引擎之间的行为.Oracle有一种我期望从SQL引擎获得完全外连接的行为:

神谕

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'); 
Run Code Online (Sandbox Code Playgroud)

当我执行以下操作时,它会给出预期的结果.结果表包含两行,其中一行包含NULLNUM字段,因为表中没有约翰雪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;
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试sql脚本:http://sqltest.net/

蜂巢

但是,在HIVE中,如果您尝试相同的操作,则完整的外部联接会生成一个包含两行的表.应该是"John Snow"行的行包含NULLFIRST_NAME,LAST_NAME和NUM字段.该1填充的ID,但仅此而已.

为何在HIVE中出现这种奇怪的行为?这是一个错误吗?或者我错过了一些东西......因为Oracle 11g似乎能够更好地处理这个问题.谢谢.

san*_*wat 0

我认为条件后的“(”问题与传统的sql略有不同。

        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);
Run Code Online (Sandbox Code Playgroud)