ログファイルをテキストとしてHDFSに保存しています。ログファイルをHiveテーブルにロードすると、すべてのファイルがコピーされます。
すべてのテキストデータを2回保存することを回避できますか?
編集:私は次のコマンドを介してそれをロードします
LOAD DATA INPATH '/user/logs/mylogfile' INTO TABLE `sandbox.test` PARTITION (day='20130221')
次に、まったく同じファイルを次の場所で見つけることができます。
/user/Hive/warehouse/sandbox.db/test/day=20130220
コピーされたと思います。
外部テーブルを使用します。
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に倉庫パス内に保管させます。
JavaアプリケーションでHDFSに直接データをコピーする代わりに、それらのファイルをローカルファイルシステムに置き、次のコマンドを使用してHive経由でHDFSにインポートすると言えます。
LOAD DATA LOCAL INPATH '/your/local/filesystem/file.csv' INTO TABLE `sandbox.test` PARTITION (day='20130221')
LOCAL
に注意してください
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/';
Hive(少なくとも真のクラスターモードで実行している場合)は、ローカルファイルシステム内の外部ファイルを参照できません。 Hiveは、テーブルの作成またはロード操作中にファイルを自動的にインポートできます。この背後にある理由は、HiveがMapReduceジョブを内部的に実行してデータを抽出するためである可能性があります。 MapReduceは、HDFSから読み取り、HDFSに書き戻し、分散モードで実行します。そのため、ファイルがローカルファイルシステムに保存されている場合、分散インフラストラクチャで使用することはできません。