2016-07-25 16 views
2

Ich erstelle externe Tabellen in Bienenstock und dann Benutzer insert overwrite directory ..., um die Dateien hinzuzufügen. Beim zweiten Mal, wenn ich meine Abfrage ausführe, erwarte ich, dass die alten Dateien gelöscht werden und neue Dateien sie ersetzen (weil ich die Option zum Überschreiben habe). Dies ist jedoch nicht der Fall, und neue Dateien werden dem Verzeichnis hinzugefügt, ohne die alten Dateien zu entfernen, was zu Inkonsistenzen in den Daten führt. Was läuft hier falsch?Einfügen überschreiben im Bienenstock funktioniert nicht richtig

+0

ist Ihre Hive-Tabelle partitioniert? –

+0

nein es ist nicht partitioniert, es ist eine einfache Tabelle –

Antwort

1

Ich wollte einen Fehler einreichen, aber dieses Problem ist vorhanden: HIVE-13997 - Wenden Sie den Patch an, wenn Sie overwrite directory für erwartete Ergebnisse verwenden möchten.

Aus-Test, was ich gefunden habe, ist:

overwrite directory und overwrite table funktioniert anders: Sie sollten overwrite table verwenden, wenn Sie das gesamte Verzeichnis überschrieben werden soll.

diese Tabelle für Test erstellt: create external table t2 (a1 int,a2 string) LOCATION '/user/cloudera/t2';

overwrite directory:

Das Verzeichnis ist, wie man erwarten würde, überschrieben; Mit anderen Worten, wenn der angegebene Pfad existiert, wird er geplottet und durch die Ausgabe ersetzt.

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

also, wenn obige Aussage wird Daten an der Stelle schreiben /user/cloudera/t2/000000_0 dann nur diese Position überschrieben.

#~~~~ 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:

der Inhalt der ausgewählten Tabelle oder Partition werden durch die Ausgabe der entsprechenden Select-Anweisung ersetzt.

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

Jetzt wird gesamt dir überschreibt:

[[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 

so abschließend überschreibt Verzeichnis nur direkten Pfad der erzeugten Datei überschreibt nicht das Verzeichnis. see Writing-data-into-the-file-system-from-queries