はじめに
FULL OUTER JOINを使っているバッチ処理があり
片方のテーブルにカラム追加することになった。
どんな結果になるのかイメージがつかなかったため
自分でテストしてみた。
環境
Hive
やったこと
下記のような2つのテーブルがある。
同じようなテーブルだが
fugaテーブルの方はカラムが1つ少ない。
###hogeテーブル
no | name | yomi | number |
---|---|---|---|
1 | 佐藤 | sato | 200 |
2 | 鈴木 | suzuki | 175 |
3 | 高橋 | takahashi | 145 |
4 | 田中 | tanaka | 135 |
5 | 渡辺 | watanabe | 115 |
6 | 伊藤 | ito | 110 |
###fugaテーブル
no | name | yomi |
---|---|---|
1 | 佐藤 | sato |
2 | 鈴木 | suzuki |
3 | 高橋 | takahashi |
4 | 田中 | tanaka |
下記のコマンドを叩いてfugaにもカラムを追加する。
ALTER TABLE fuga ADD COLUMNS (number INT);
こうするとnumberカラムが追加されるが、カラムの中身はNULLになる。
###fugaテーブル(カラム追加直後)
no | name | yomi | number |
---|---|---|---|
1 | 佐藤 | sato | NULL |
2 | 鈴木 | suzuki | NULL |
3 | 高橋 | takahashi | NULL |
4 | 田中 | tanaka | NULL |
ここで下記のSQLを投げてfugaの中身を
INSERT OVERWRITEで上書きしてみると思ってた結果と違った。
###投げたSQL
INSERT OVERWRITE TABLE fuga
SELECT
if(h.no IS NULL, f.no, h.no) as no,
if(h.name IS NULL, f.name, h.name) as name,
if(h.yomi IS NULL, f.yomi, h.yomi) as yomi,
if(h.number IS NULL, f.number, h.number) as number
FROM
(
SELECT
*
FROM
hoge
) h
FULL OUTER JOIN
fuga f
ON
h.no = f.no
;
###INSERT OVERWRITE後のfugaテーブル(予想)
no | name | yomi | number |
---|---|---|---|
1 | 佐藤 | sato | NULL |
1 | 佐藤 | sato | 200 |
2 | 鈴木 | suzuki | NULL |
2 | 鈴木 | suzuki | 175 |
3 | 高橋 | takahashi | NULL |
3 | 高橋 | takahashi | 145 |
4 | 田中 | tanaka | NULL |
4 | 田中 | tanaka | 135 |
5 | 渡辺 | watanabe | 115 |
6 | 伊藤 | ito | 110 |
###INSERT OVERWRITE後のfugaテーブル(実際の結果)
no | name | yomi | number |
---|---|---|---|
1 | 佐藤 | sato | 200 |
2 | 鈴木 | suzuki | 175 |
3 | 高橋 | takahashi | 145 |
4 | 田中 | tanaka | 135 |
5 | 渡辺 | watanabe | 115 |
6 | 伊藤 | ito | 110 |
終わりに
クエリを見ればわかる当たり前な結果が出たけど
テストしてみるまで間違った予想をしていたので
自分で手を動かして確かめて良かった。