2016-07-25 9 views
2

ハイブで外部表を作成してから、ユーザーinsert overwrite directory ...を追加してファイルを追加します。しかし、私は私のクエリを実行する2回目に私は古いファイルが削除され、(私は上書きオプションがあるため)新しいファイルを置き換えると期待しています。しかし、そうではなく、古いファイルを削除せずに新しいファイルがディレクトリに追加され、データの不一致が発生します。ここで何がうまくいかないのですか?ハイブでの上書きの挿入が正しく動作しない

+0

は、ハイブテーブルを分割したものですか? –

+0

いいえパーティション化されていない、単純なテーブルです –

答えて

1

私はバグを提出しようとしていましたが、これは既存の問題です:HIVE-13997 - 期待される結果をoverwrite directoryにする場合は、パッチを適用してください。私が発見したものをテストから

は次のとおりです。

overwrite directoryoverwrite tableは異なる動作を:あなたはディレクトリ全体を上書きしたい場合は、overwrite tableを使用する必要があります。

は、テストのために、この表を作成しました:create external table t2 (a1 int,a2 string) LOCATION '/user/cloudera/t2';

overwrite directory:

をディレクトリが上書きされ、あなたが期待するように、です。言い換えれば、指定されたパスが存在する場合は、それはclobberedされ、出力と置き換えられます。

hive> insert overwrite directory '/user/cloudera/t2' select * from sqoop_import.departments;

上記の文は場所/user/cloudera/t2/000000_0にデータを書き込むことが起こっているのであれば、その後にのみ、この場所が上書きされます。

#~~~~ BEFORE ~~~~ 
[[email protected] ~]$ hadoop fs -ls /user/cloudera/t2/* 
-rwxr-xr-x 1 cloudera cloudera   60 2016-07-25 17:42 /user/cloudera/t2/000000_0 
-rwxr-xr-x 1 cloudera cloudera   0 2016-07-25 15:48 /user/cloudera/t2/_SUCCESS 
-rwxr-xr-x 1 cloudera cloudera   88 2016-07-25 15:48 /user/cloudera/t2/part-m-00000 
-rwxr-xr-x 1 cloudera cloudera   60 2016-07-25 15:48 /user/cloudera/t2/part-m-00001 

#~~~~ AFTER: Note the timestamp ~~~~ 
[[email protected] ~]$ hadoop fs -ls /user/cloudera/t2/* 
-rwxr-xr-x 1 cloudera cloudera   60 2016-07-25 18:01 /user/cloudera/t2/000000_0 
-rwxr-xr-x 1 cloudera cloudera   0 2016-07-25 15:48 /user/cloudera/t2/_SUCCESS 
-rwxr-xr-x 1 cloudera cloudera   88 2016-07-25 15:48 /user/cloudera/t2/part-m-00000 
-rwxr-xr-x 1 cloudera cloudera   60 2016-07-25 15:48 /user/cloudera/t2/part-m-00001 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

overwrite table:

選択されたテーブルの内容又はパーティションは対応するselectステートメントの出力に置き換えられます。

hive> insert overwrite table t2 select * from sqoop_import.departments;

今全体のディレクトリが上書きされます。結論、上書きディレクトリにあるので、

[[email protected] ~]$ hadoop fs -ls /user/cloudera/t2/* 
-rwxr-xr-x 1 cloudera cloudera   60 2016-07-25 18:03 /user/cloudera/t2/000000_0 
-rwxr-xr-x 1 cloudera cloudera   0 2016-07-25 15:48 /user/cloudera/t2/_SUCCESS 

だけで生成されたファイルではないディレクトリの直接のパスを上書きします。 see Writing-data-into-the-file-system-from-queries

関連する問題