2016-04-15 6 views
2

Meine S3-Datei (s3://MY_s3/stage/my_s3_file) eine Partition auf load_dt:Laden Redshift von S3 (mit Partitionen)

S3 Struktur:

-MY_S3 
--stage 
    ---my_s3_file 
    ----load_dt=2016-02-01 
     ----000024 
    ----load_dt=2016-02-02 
     ----000036 

Die eigentlichen Dateien sind unter load_dt Partitionen wie 000.024 & 000036.

Der COPY-Befehl funktioniert gut, wenn ich load_dt nicht in der Redshift-Tabelle halte, aber wenn ich load_dt in der Redshift-Tabelle hinzufüge, schlägt der COPY-Befehl aufgrund eines Datenfehlers als Eingabe-LayoutfehlZiellayout stimmt nicht überein (mit extra load_dt im Ziel).

Die Hive-Tabelle, die die S3-Datei erstellt, zeigt partitionierte load_dt am Ende.

Wie funktioniert dieser COPY-Befehl, wenn load_dt auf dem Ziel-Redshift ist?

Ich habe sogar versucht, S3-Standorte zu s3://MY_s3/stage/my_s3_file/load_dt zu ändern, aber kein Glück.

Antwort

0

Ich denke, ich fand die Antwort für meinen Fall.

Ich konnte die Hive-Partition nicht laden, da Hive diesen Partitionswert in Hive-Metadaten speichert, deshalb war die Partitionsspalte in der S3-Datei nicht vorhanden.

Jetzt bin ich eine neue Spalte zu S3 durch Hive als Load_Dt_New hinzufügen, so dass die S3-Datei die erforderliche Spalte für meine Redshift COPY Befehl funktionieren würde.

0

"Kopiertabelle von 's3: // MY_s3/stage/my_s3_file/load_dt'" sollte funktionieren, wenn Sie den Dateinamen in "load_dt_20160201" anstelle von "load_dt = 2016-02-01" ändern können. COPY-Befehl übernimmt den letzten Teil des S3-Pfades als Präfix.

+0

ich in der Lage bin Tisch zu laden, ohne load_dt mit S3 Lage s3: // MY_s3/stage/my_s3_file/aber nicht in der Lage, die letzte Spalte hinzuzufügen, die die Partitionsspalte load_dt ist. Mit s3: // MY_s3/stage/my_s3_file/load_dt = 2016-02-01 werden nur diese Partitionsdaten geladen, jedoch ohne den Wert load_dt. – rkj

2

Wenn Hive (unter Apache Hadoop ausgeführt) einen partitionierten EXTERNAL TABLE erstellt, werden Dateien nach Verzeichnis sortiert. Zum Beispiel werden alle Zeilen mit load_dt=2016-02-01 im Verzeichnis load_dt=2016-02-01 gespeichert.

Die Dateien im Verzeichnis speichern keinen Wert für die Partitionsspalte (load_dt). Stattdessen wird der Wert der Partitionsspalte als Teil des Verzeichnisnamens gespeichert. Wenn Sie das Verzeichnis umbenennen, ändert sich der Wert in dieser Spalte für alle Zeilen innerhalb des Verzeichnisses.

Ja, es ist ein bisschen seltsam, aber so speichert Hive seine Daten!

Amazon Redshift kann CSV-Dateien (einschließlich komprimierter CSV-Dateien) von Amazon S3 importieren. Es kann sogar Dateien aus mehreren Unterverzeichnissen importieren, da nur das Pfadpräfix der zu ladenden Dateien angezeigt wird. Es versteht jedoch nicht die Art und Weise, in der Hive partitionierte Daten speichert, sodass die Partitionsspalte nicht aus dem Verzeichnisnamen geladen wird.

Einige Optionen:

  • eine weitere Spalte in den Ausgangsdaten hinzufügen, die denselben Wert enthält
  • Führen Sie einen Befehl nach dem COPY (wie man jetzt getan haben), die den Spaltenwert auf einige Berechnung zugrunde legt (zB von einem Datumsfeld)
  • Legen Sie ein Verzeichnis zu einem Zeitpunkt (Komplex zu erreichen und nicht so effizient)