2017-02-06 10 views
0

私はYEAR, MONTH, DAYパーティショニングを持つ既存のバケットテーブルを持っていますが、既存のテーブルに存在しないカラムであるINGESTION_KEYでパーティションを追加したいとします。これは将来のテーブルの挿入に対応するため、その日付のデータを取り込むたびにOVERWRITEYEAR, 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_tblsrc_tbl同じ数のバケットに同じ列でクラスタ化された新しいテーブル、そして唯一の違いは、スキーマ内では、INGESTION_KEYが追加されます。

これまでのところ、私のSELECT * FROM dest_tblは、新しいテーブルのすべてが正常に見えることを示しています。だから私の質問です:このアプローチに何か問題はありますか?この方法で管理されたバケツテーブルにINSERTが悪いですか、コピーされたデータに対して変換が行われていない場合はINSERTに代わるものですか?

ありがとうございます!

+0

バックアップ/リストア操作ではなく、「INSERT」という言葉で考えるべきではありません。 Hiveメタストアは、ディレクトリ構造のデータファイルのみをトレースしません。ファイル構造がメタデータと一致する限り、それは公正です。 –

+0

それはまた、ProductionデータをサンプリングしてTestまたはQAクラスタに出荷する便利な方法です... –

答えて

2

私はちょうどハイブにそれをすべて行うためにハイブのクエリによってコピーを好むが、それは他のツールを使用してデータファイルをコピーしても大丈夫ですが、...

  • が新しいパーティションを追加し、専用のコマンドがありますメタデータは、あなたはalter table add partition..の代わりにそれを使用することができ、そしてそれは一度に多くのパーティションを追加することができます。

    MSCK REPAIR TABLE dest_tbl; 
    
  • は、ハイブのデフォルトのパーティションのフォーマットを使用してください:partionKey=partitionValue

関連する問題