11

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

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

編集:次のコマンドでロードします

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

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

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

コピーしたものと判断しました。

4

4 に答える 4

15

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

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 ディレクトリでなければなりません。

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

于 2013-03-07T22:48:59.143 に答える
4

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

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

注意してくださいLOCAL

于 2013-03-07T13:34:10.090 に答える
1

データの重複を避けるために、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/';
于 2014-03-04T11:16:54.507 に答える
0

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

于 2014-04-23T12:43:08.927 に答える