web-dev-qa-db-ja.com

データをコピーせずにHiveテーブルにデータをインポートすることは可能ですか?

ログファイルをテキストとしてHDFSに保存しています。ログファイルをHiveテーブルにロードすると、すべてのファイルがコピーされます。

すべてのテキストデータを2回保存することを回避できますか?

編集:私は次のコマンドを介してそれをロードします

LOAD DATA INPATH '/user/logs/mylogfile' INTO TABLE `sandbox.test` PARTITION (day='20130221')

次に、まったく同じファイルを次の場所で見つけることができます。

/user/Hive/warehouse/sandbox.db/test/day=20130220

コピーされたと思います。

10
Mad Echet

外部テーブルを使用します。

CREATE EXTERNAL TABLE sandbox.test(id BIGINT, name STRING) ROW FORMAT
              DELIMITED FIELDS TERMINATED BY ','
              LINES TERMINATED BY '\n' 
              STORED AS TEXTFILE
              LOCATION '/user/logs/';

外部テーブルでパーティションを使用する場合は、パーティションディレクトリを管理する必要があります。指定する場所はhdfsディレクトリである必要があります。

外部テーブルを削除しても、Hiveはソースデータを削除しません。 yo rawファイルを管理したい場合は、外部テーブルを使用してください。 Hiveにそれを実行させたい場合は、Hiveに倉庫パス内に保管させます。

14
cran1um

JavaアプリケーションでHDFSに直接データをコピーする代わりに、それらのファイルをローカルファイルシステムに置き、次のコマンドを使用してHive経由でHDFSにインポートすると言えます。

LOAD DATA LOCAL INPATH '/your/local/filesystem/file.csv' INTO TABLE `sandbox.test` PARTITION (day='20130221')

LOCALに注意してください

3

ALTER TABLE Partitionステートメントを使用して、データの重複を回避できます。

create External table if not exists TestTable (testcol string) PARTITIONED BY (year INT,month INT,day INT) row format delimited fields terminated by ',';

ALTER table TestTable partition (year='2014',month='2',day='17') location 'hdfs://localhost:8020/data/2014/2/17/';
0
Chetan Shirke

Hive(少なくとも真のクラスターモードで実行している場合)は、ローカルファイルシステム内の外部ファイルを参照できません。 Hiveは、テーブルの作成またはロード操作中にファイルを自動的にインポートできます。この背後にある理由は、HiveがMapReduceジョブを内部的に実行してデータを抽出するためである可能性があります。 MapReduceは、HDFSから読み取り、HDFSに書き戻し、分散モードで実行します。そのため、ファイルがローカルファイルシステムに保存されている場合、分散インフラストラクチャで使用することはできません。

0