80個のテーブルを含むHiveテーブルにデフォルトのdbがあります。
もう1つのデータベースを作成しました。すべてのテーブルをデフォルトのDBから新しいデータベースにコピーしたいと思います。
個別のテーブルを作成せずに、1つのDBから他のDBにコピーする方法はありますか。
解決策があれば教えてください。
いくつかのオプションが考えられます。
CTASを使用します。
CREATE TABLE NEWDB.NEW_TABLE1 AS select * from OLDDB.OLD_TABLE1;
CREATE TABLE NEWDB.NEW_TABLE2 AS select * from OLDDB.OLD_TABLE2;
...
HiveのIMPORT機能を使用する https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+ImportExport
お役に立てれば。
old_db.tableのような外部テーブルnew_db.tableを作成するlocation '(hdfsファイル内のファイルのパス)';
テーブルにパーティションがある場合、new_db.tableにパーティションを追加する必要があります。
次のオプションのいずれかにアプローチできます。
構文は次のようになります。EXPORT TABLE table_or_partition TO hdfs_path; IMPORT [[EXTERNAL] TABLE table_or_partition] FROM hdfs_path [LOCATION [table_location]];
いくつかのサンプルステートメントは次のようになります。EXPORT TABLE TO 'location in hdfs';
Test_dbを使用します。 IMPORT FROM 'location in hdfs';
エクスポートインポートは、パーティション単位でも実行できます。EXPORTTABLE PARTITION(loc = "USA")to 'location in hdfs';
以下のインポートコマンドは、管理対象のテーブルではなく外部テーブルにインポートしますIMPORT EXTERNAL TABLE FROM 'location in hdfs' LOCATION ‘/ location/of/external/table';
これらはおそらく、あるdbから別のdbにテーブルをコピー/移動するための最速かつ最も簡単な方法です。
テーブルを移動するにはsource
0.14以降、次のステートメントを使用して、同じメタストア内のデータベース間でテーブルを移動できます。
alter table old_database.table_a rename to new_database.table_a;
table_a
が管理テーブルの場合、上記のステートメントはhdfsのテーブルデータも移動します。
テーブルをコピーするには
いつでもCREATE TABLE <new_db>.<new_table> AS SELECT * FROM <old_db>.<old_table>;
ステートメントを使用できます。ただし、hdfs dfs -cp
を使用してデータベースをコピーし、LIKE
を使用してテーブルを作成するこの代替方法は、テーブルが大きい場合は少し速くなると思います。
hdfs dfs -cp /user/Hive/warehouse/<old_database>.db /user/Hive/warehouse/<new_database>.db
そして、ハイブで:
CREATE DATABASE <new_database>;
CREATE TABLE <new_database>.<new_table> LIKE <old_database>.<old_table>;