Hiveのleft join、left outer join、left semi joinの3つの違い

6321 ワード

Hiveのleft join、left outer join、left semi joinの3つの違い


HiveのJoinのドキュメント説明アドレス:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual%2BJoins
次の2つのテスト・データ・テーブルのテーブル文を示します.
use test;

DROP TABLE IF EXISTS table1;
create table table1(
    student_no      bigint  comment ' ',
    student_name    string  comment ' '
)
COMMENT 'test  '
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '
'
STORED AS TEXTFILE;
DROP TABLE IF EXISTS table2; create table table2( student_no bigint comment ' ', class_no bigint comment ' ' ) COMMENT 'test ' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '
'
STORED AS TEXTFILE;
load data local inpath 'data_table1.txt' overwrite into table table1; load data local inpath 'data_table2.txt' overwrite into table table2;

use test;
DROP TABLE IF EXISTS table1;
create table table1(
     student_No bigint comment'学号',
     student_name string comment'名前'
)
COMMENT'test学生情報'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY ''
STORED AS TEXTFILE;
DROP TABLE IF EXISTS table2;
create table table2(
     student_No bigint comment'学号',
     class_No bigint comment'カリキュラム番号'
)
COMMENT'test学生選択情報'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY ''
STORED AS TEXTFILE;
load data local inpath 'data_table1.txt' overwrite into table table1;
load data local inpath 'data_table2.txt' overwrite into table table2;
テストデータは次のとおりです.
hive left joinテストデータ

テスト1:left join


文:
select * from table1 left outer join table2 on(table1.student_no=table2.student_no);
結果:
FAILED: Parse Error: line 1:22 cannot recognize input near ‘left’ ‘join’ ‘table2′ in join type specifier
私が使っているHIVEバージョンは0.8で、直接のleft joinの書き方はサポートされていません.

テスト2:left outer join


文:
select * from table1 left outer join table2 on(table1.student_no=table2.student_no);
結果:
1 name1 1 11
1 name1 1 12
1 name1 1 13
2 name2 2 11
2 name2 2 14
3 name3 3 15
3 name3 3 12
4 name4 4 13
4 name4 4 12
5 name5 5 14
5 name5 5 16
6 name6 NULL NULL
left outer joinの左のテーブルのデータがすべて列に並んでいるのが見えますが、右のテーブルに対応する列がなければNULL値と書きます.
また,左のプライマリ・キーが右側にN本を見つけた場合,ここでプライマリ・キーが1の右側の3本を示すように,結果としてN本をフォークして得られることにも気づいた.

テスト3:left semi join


文:
select * from table1 left semi join table2 on(table1.student_no=table2.student_no);
結果:
1 name1
2 name2
3 name3
4 name4
5 name5
左側のテーブルの列のみが印刷され、プライマリ・キーが右側のテーブルに存在する場合は印刷され、そうでない場合はフィルタされます.
結論:
hiveは「left join」の書き方をサポートしていません.
hiveのleft outer join:右に複数の行と左のテーブルが対応している場合、各行に出力がマッピングされます.右の行が左の行に対応していない場合は、左の行が出力され、右の表フィールドはNULLです.
hiveのleft semi join:SQLに相当するin文、例えば上記テスト3の文は「select*from table 1 where table 1.student_no in(table 2.student_no)」に相当し、結果としてBテーブルのフィールドはないことに注意してください.
本住所:http://www.crazyant.net/1470.html