Hiveテーブル接続

3030 ワード

Hiveにおけるテーブル接続操作は大きく分けて以下の4つに分けられる.
1:joinは等値接続であり、ある値が2つのテーブルに同時に存在する場合にのみ取得されます.
2:left outer joinは左外接続で、左のテーブルの値は右のテーブルに存在するかどうかにかかわらず出力されますが、右のテーブルのレコードは左のテーブルに存在する場合にのみ出力されます.
3:right outer joinは右外部接続で、右側のテーブルの値は左のテーブルにあるかどうかにかかわらず出力されますが、左のテーブルのレコードは右側にある場合にのみ出力されます(left outer joinとは逆).
4:left semi joinはexitsに似た左半接続です.
次に、これらの接続操作を具体的な例で説明します.
#userテーブルのデータは次のとおりです.
hive (hive)> select * from user;
OK
id	name
1	lavimer
2	liaozhongmin
3	liaozemin
Time taken: 0.112 seconds

#postテーブルのデータは次のとおりです.
hive (hive)> select * from post;
OK
uid	pid	title
1	1	Thinking in Java
1	2	Thinking in Hadoop
2	3	Thinking in C
4	4	Thinking in Hive
5	5	Thinking in HBase
5	6	Thinking in Pig
5	7	Thinking in Flume
Time taken: 0.11 seconds

一:等値接続
hive (hive)> select s.id,s.name,t.pid,t.title from
           > (select id,name from user) s
           > join
           > (select uid,pid,title from post) t
           > on s.id=t.uid;

検索結果は次のとおりです.
id	name	pid	title
1	lavimer	1	Thinking in Java
1	lavimer	2	Thinking in Hadoop
2	liaozhongmin	3	Thinking in C

二:左外接続
hive (hive)> 
           > select s.id,s.name,t.pid,t.title from
           > (select id,name from user) s
           > left outer join
           > (select uid,pid,title from post) t
           > on s.id=t.uid;

検索結果は次のとおりです.
id	name	pid	title
1	lavimer	1	Thinking in Java
1	lavimer	2	Thinking in Hadoop
2	liaozhongmin	3	Thinking in C
3	liaozemin	NULL	NULL

注意:上記の結果から、postテーブルのuidはuserテーブルに存在する場合にのみレコードを出力し、そうでない場合はNULLを出力することがわかります.
三:右外部接続
hive (hive)> select s.id,s.name,t.pid,t.title from
           > (select id,name from user) s
           > right outer join
           > (select uid,pid,title from post) t
           > on s.id=t.uid;

検索結果は次のとおりです.
id	name	pid	title
1	lavimer	1	Thinking in Java
1	lavimer	2	Thinking in Hadoop
2	liaozhongmin	3	Thinking in C
NULL	NULL	4	Thinking in Hive
NULL	NULL	5	Thinking in HBase
NULL	NULL	6	Thinking in Pig
NULL	NULL	7	Thinking in Flume

注意:上記の結果から、userテーブルのidはpostテーブルに存在する場合にのみレコードが出力され、そうでない場合はNULLが出力されることがわかります.
四:左半接続
hive (hive)> select s.id,s.name from
           > (select id,name from user) s
           > left semi join
           > (select uid,pid,title from post) t
           > on s.id=t.uid;

検索結果は次のとおりです.
id	name
1	lavimer
2	liaozhongmin

このleft semi joinは,Hiveにはin/exitsのような句はないが,このような操作が必要であるため,Hiveはこのタイプの句をleft semi joinに変換する.上の文は次のように簡単に書くことができます.
hive (hive)> select user.id,user.name from user
           > left semi join
           > post 
           > on (user.id=post.uid);

上のHQL文は、次のSQL文と同等です.
select id,name from user
where id in
(select uid from post);