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

时间:2016-06-14 07:50:22

标签: hadoop oracle11g null hive full-outer-join

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

的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'); 

当我执行以下操作时,它会给我预期的结果。结果表包含两行,其中一行包含NULL字段的NUM,因为表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;

您可以在此处测试sql脚本:http://sqltest.net/

HIVE

但是,在HIVE中,如果您尝试相同的操作,则完整的外部联接会生成一个包含两行的表。应该是" John Snow"对于FIRST_NAME,LAST_NAME和NUM字段,行包含NULL1已填入ID,但就是Matrix

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

2 个答案:

答案 0 :(得分:1)

我无法模拟@ Candic3

报告的结果

我使用了以下语句以及#34; select"在问题中查询。

value_counts()

请查看附件。

但是,由于未注意到的小错误,例如DDL与实际数据之间的数据类型不匹配(例如,来自平面文件)或DDL中提到的分隔符与实际数据中的分隔符不匹配,因此select查询将返回NULL 。Query_result

答案 1 :(得分: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);