Hiveテーブル接続
3030 ワード
Hiveにおけるテーブル接続操作は大きく分けて以下の4つに分けられる.
1:joinは等値接続であり、ある値が2つのテーブルに同時に存在する場合にのみ取得されます.
2:left outer joinは左外接続で、左のテーブルの値は右のテーブルに存在するかどうかにかかわらず出力されますが、右のテーブルのレコードは左のテーブルに存在する場合にのみ出力されます.
3:right outer joinは右外部接続で、右側のテーブルの値は左のテーブルにあるかどうかにかかわらず出力されますが、左のテーブルのレコードは右側にある場合にのみ出力されます(left outer joinとは逆).
4:left semi joinはexitsに似た左半接続です.
次に、これらの接続操作を具体的な例で説明します.
#userテーブルのデータは次のとおりです.
#postテーブルのデータは次のとおりです.
一:等値接続
検索結果は次のとおりです.
二:左外接続
検索結果は次のとおりです.
注意:上記の結果から、postテーブルのuidはuserテーブルに存在する場合にのみレコードを出力し、そうでない場合はNULLを出力することがわかります.
三:右外部接続
検索結果は次のとおりです.
注意:上記の結果から、userテーブルのidはpostテーブルに存在する場合にのみレコードが出力され、そうでない場合はNULLが出力されることがわかります.
四:左半接続
検索結果は次のとおりです.
このleft semi joinは,Hiveにはin/exitsのような句はないが,このような操作が必要であるため,Hiveはこのタイプの句をleft semi joinに変換する.上の文は次のように簡単に書くことができます.
上のHQL文は、次のSQL文と同等です.
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);