私はYEAR, MONTH, DAY
パーティショニングを持つ既存のバケットテーブルを持っていますが、既存のテーブルに存在しないカラムであるINGESTION_KEY
でパーティションを追加したいとします。これは将来のテーブルの挿入に対応するため、その日付のデータを取り込むたびにOVERWRITE
YEAR, MONTH, DAY
パーティションにする必要はありません。私は単純にINSERT INTO
を実行し、新しいINGESTION_KEY
パーティションを作成することができます。パーティションディレクトリを倉庫にコピーしてハイブ管理テーブルをコピー
新しいテーブルに1年分のデータが必要です。そのため、1年分のパーティションを既存のテーブルから新しいテーブルにコピーします。パーティションごとにHive INSERT
を実行するのではなく、distcp
を使用して、HDFSのHiveウェアハウスディレクトリにある新しいテーブルのパーティションディレクトリにファイルをコピーし、次に新しいテーブルにADD PARTITION
というファイルをコピーする方が早いと思った。
だから、これは私がやっているすべてです:
hadoop distcp /apps/hive/warehouse/src_db.db/src_tbl/year=2017/month=02/day=06 /apps/hive/warehouse/dest_db.db/dest_tbl/year=2017/month=02/day=06/ingestion_key=123
hive -e "ALTER TABLE dest_tbl ADD PARTITION (year=2017,month=02,day=06,ingestion_key='123')"
どちら管理テーブル、dest_tbl
はsrc_tbl
同じ数のバケットに同じ列でクラスタ化された新しいテーブル、そして唯一の違いは、スキーマ内では、INGESTION_KEY
が追加されます。
これまでのところ、私のSELECT * FROM dest_tbl
は、新しいテーブルのすべてが正常に見えることを示しています。だから私の質問です:このアプローチに何か問題はありますか?この方法で管理されたバケツテーブルにINSERT
が悪いですか、コピーされたデータに対して変換が行われていない場合はINSERT
に代わるものですか?
ありがとうございます!
バックアップ/リストア操作ではなく、「INSERT」という言葉で考えるべきではありません。 Hiveメタストアは、ディレクトリ構造のデータファイルのみをトレースしません。ファイル構造がメタデータと一致する限り、それは公正です。 –
それはまた、ProductionデータをサンプリングしてTestまたはQAクラスタに出荷する便利な方法です... –