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