Hiveでpartitionはテーブル定義と紐づいているようだ

Hiveのテーブルにカラムを追加した時に
追加したカラムがスッカスカでデータが取れないことがあった。

結論から言うと、パーティションが変更前のテーブル定義と紐づいてるから
追加カラムの値が取れなかったってこと。

なのでパーティションを作り直すと追加カラムのデータが取れた。


そのことを知見として書き留めておこう。

データ

こんなデータ

hoge_data.tsv.gz (↓タブ区切りね)

id	name
001	hoge
002	fuga
003	mohimohi

最初のテーブル定義

パーティションは適当、でもこれがくせもの。
external じゃなくてもいいかも、たぶん。

name カラムが無いことに注意。あとから作る。

create external table if not exists hogehoge_table (
  id     string
)
partitioned by (
  version string
)
row format delimited fields terminated by '\t' null defined as '' stored as textfile
location '/hoge/test.db/hogehoge_table';

フォルダ作成

hdfsに下記のフォルダを作っておき、hoge_data.tsv.gzを入れておく。
/hoge/test.db/hogehoge_table/version=1234

パーティション作成

Hiveを起動して下記コマンド。自分はbeeline使ってるけど、普通は何使うんだろう?

alter table hogehoge_table add partition (version="1234");

SQL

でさっそくSQLを実行してみる。

select * from hogehoge_table where version="1234";

hogehoge_table.id    hogehoge_table.version
001                           1234
002                           1234
003                           1234

予想通りに取れる。

カラムを追加する

alter table hogehoge_table add columns (
  name     string
);
select * from hogehoge_table where version="1234";
hogehoge_table.id      hogehoge_table.name         hogehoge_table.version
001                                                    1234
002                                                    1234
003                                                    1234

→name 列が取れてない!

パーティションを削除してもう一回作る

alter table hogehoge_table drop partition (version="1234");

alter table hogehoge_table add partition (version="1234");

もう一回SQL実行

select * from hogehoge_table where version="1234";

hogehoge_table.id   hogehoge_table.name   hogehoge_table.version
001                         hoge                    1234
002                         fuga                    1234
003                       mohimohi                  1234

→name列が取れてる

結論


でもな、impalaではこんなことは起きなかった。
なんでだろうね。

参考

別の人も同じこと起きてるみたい。

bigpicture.pl


Hiveのwiki見るとSQLの書き方が書いてある。
LanguageManual DDL - Apache Hive - Apache Software Foundation

ALTER TABLEの時にPARTITION入れればいいのね。

ALTER TABLE table_name [PARTITION partition_spec] ADD COLUMNS (col_name data_type ...);

プログラミング Hive

プログラミング Hive

  • 作者: Edward Capriolo,Dean Wampler,Jason Rutherglen,佐藤直生,嶋内翔,Sky株式会社玉川竜司
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2013/06/15
  • メディア: 大型本
  • この商品を含むブログ (3件) を見る
ビッグデータ分析・活用のためのSQLレシピ

ビッグデータ分析・活用のためのSQLレシピ