2016-06-14 89 views
6

SQL motorları arasındaki davranışları karşılaştırıyorum.HIVE'da tam dış katılma neden birleşim alanları eksik olduğunda garip sonuç verir?

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

Ben aşağıdaki yürütmek, bu bana beklenen sonuçları verir: Oracle tam dış birleşimler için bir SQL motoru beklediğiniz davranış vardır. Ortaya çıkan tablo, NUM alanı için NULL içeren satırlardan biri ile birlikte iki satır içerir, çünkü tablo sql_test_b tablosunda hiç bir john karı yoktur. Aynı şeyi denemek olsaydı

kovanında Ancak, tam dış iki satır içeren bir tablo sonuçları katılmak http://sqltest.net/

Hive:

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; 

Burada sql komut test edebilirsiniz . "John Snow" satırı olması gereken satır, FIRST_NAME, LAST_NAME ve NUM alanları için NULL içeriyor. 1, ID için doldurulur, ancak bu kadar.

HIVE'da neden bu garip davranışlar var? Bu bir hata mı? Ya da bir şey özlüyorum ... çünkü Oracle 11g bunu daha iyi hallediyor. Teşekkürler.

+1

mysql tam dış katılımı desteklemiyor, sonra doğru sonucu nasıl alıyorsunuz? – Farooque

+0

Sanırım, Oracle, MySQL değil. Teşekkürler @Farooque !! – Candic3

+0

Bu davranış HIVE normal mi? – Candic3

cevap

0

ben konuyu düşünmek "(" sonra koşuluyla geleneksel sql biraz daha farklıdır.

 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

ben birlikte aşağıda ifadeleri kullanıldı

Candic3 @ tarafından rapor sonucu taklit olamazdı aynı söz konusu olduğu gibi sorguyu "select".

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; 

ekli sonucu bulabilirsiniz.

Ancak, sorguyu seç, DDL ve gerçek veriler (örneğin, düz dosyalar) arasındaki veri türü uyuşmazlığı veya DDL'de ve gerçek verilerdeki sınırlayıcılar arasında uyumsuzluk gibi önemsiz küçük hatalar nedeniyle NULL döndürür. Query_result

+0

'DDL' nedir? – Candic3

+0

Lütfen bunu okuyun: http://stackoverflow.com/questions/2578194/what-is-ddl-and-dml – Marco99