web-dev-qa-db-ja.com

ソースファイルを削除せずにHDFSからHiveにデータをロードする方法

HDFSからHiveにデータをロードするとき、使用

LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename;

コマンド、hdfs_fileをHive/warehouse dirに移動しているようです。ファイルを別のプロセスで使用するために、移動する代わりにコピーすることは可能ですか?.

46
Suge

あなたの質問から、あなたはすでにあなたのデータをhdfsに持っていると仮定します。したがって、LOAD DATAは必要ありません。これは、ファイルをデフォルトのHiveロケーション/user/Hive/warehouseに移動します。 externalkeywordを使用してテーブルを簡単に定義できます。これにより、ファイルはそのまま残りますが、Hiveメタストアにテーブル定義が作成されます。こちらをご覧ください: テーブルDDLの作成 例:

create external table table_name (
  id int,
  myfields string
)
location '/my/location/in/hdfs';

使用する形式はデフォルトと異なる場合があることに注意してください(JigneshRawalがコメントで述べているように)。 Sqoopを使用する場合など、独自の区切り文字を使用できます。

row format delimited fields terminated by ','
83
Dag

EXTERNAL TABLEとLOCATIONを一緒に使用すると、Hiveはテーブルを作成し、最初はデータが表示されないことがわかりました(データの場所がHiveの「LOCATION」と異なる場合)。

「LOAD DATA INPATH」コマンドを使用すると、データは(コピーの代わりに)データの場所からHiveテーブルの作成中に指定した場所に移動します。

Hiveテーブルの作成時に場所が指定されない場合、内部Hiveウェアハウスの場所が使用され、データはソースデータの場所から内部Hiveデータウェアハウスの場所(つまり、/ user/Hive/warehouse /)に移動されます。

5
Avinash

「LOAD DATA」の代わりに、既存のソースの場所からHiveデータウェアハウスの場所にデータを移動しない方法があります。

「LOCATION」オプションを指定してALTER TABLEコマンドを使用できます。以下は必須コマンドです

ALTER TABLE table_name ADD PARTITION (date_col='2017-02-07') LOCATION 'hdfs/path/to/location/'

ここでの唯一の条件は、場所がファイルではなくディレクトリであることです。

これで問題が解決することを願っています。

3
Avinash