2016-04-06 6 views
1

Fehler Wenn ein COPY Befehl ausgeführt wurde, sind ein paar Informationen gedruckt, wie:Identifizieren Redshift COPY Aufzeichnungen in Ruby

INFO: Load into table '<table>' completed, 22666 record(s) loaded successfully. 
INFO: Load into table '<table>' completed, 1 record(s) could not be loaded. Check 'stl_load_errors' system table for details. 

Und ich muss andernfalls Aufzeichnungen identifizieren.

So brauche ich 2 Dinge:

  • Bestimmen Sie, wenn Reihen scheitern: jetzt, es ist nur auf dem Bildschirm gedruckt, und ich weiß nicht, wie die Nachricht in Code zu erhalten.
  • Ermitteln Sie die fehlerhaften Zeilen.

Eine Möglichkeit, das zu tun wäre, um die query Kennung zuzugreifen, die in der Tabelle zu sehen ist stl_load_errors, aber ich habe keine Ahnung, wie es für den Zugriff von Code.

(Ich verwende den pg gem derzeit Rotverschiebung verbinden)

Antwort

1

stl_load_errors eine Tabelle in Redshift ist, dass (wie Sie schon erraten haben) alle Fehler enthält, die beim Laden in Redshift passieren. So können Sie es abfragen, indem Sie so etwas wie tun:

SELECT * FROM stl_load_errors 

jetzt Ihre Fragen das folgende Snippet zu beantworten:

database = PG.connect(redshift) 
begin 
    query = "COPY %s (%s) FROM 's3://%s/%s' CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' CSV GZIP" % 
[ table, columns, s3_bucket, s3_key, access_key_id, secret_access_key ] 

    database.exec(query) 
    puts 'File succesfully imported' 
rescue PG::InternalError 
    res = database.exec("SELECT line_number, colname, err_reason FROM pg_catalog.stl_load_errors WHERE filename = 's3://#{s3_bucket}/#{s3_key}'") 
    res.each do |row| 
    puts "Importing failed:\n> Line %s\n> Column: %s\n> Reason: %s" % row.values_at('line_number', 'colname', 'err_reason') 
end 
end 

Das Ausgangs sollten alle Informationen, die Sie benötigen, rufen Sie Variablen wie redshift, table , columns, s3_bucket, s3_key, access_key_id und secret_access_key hängen von Ihrer Konfiguration ab.

UPDATE:

Sie Ihren Kommentar unten zu beantworten, genauer gesagt, Sie eine Abfrage wie folgt verwenden:

"SELECT lines_scanned FROM pg_catalog.stl_load_commits WHERE filename = 's3://#{s3_bucket}/#{s3_key}' AND errors = -1" 
+0

gut aussieht, noch eine Sache, haben Sie eine Idee, die bekommen haben Anzahl der erfolgreich geladenen Datensätze? (In diesem Fall 22666, die gedruckt ist "Ich weiß nicht wie"). – Drico

+0

Die Anzahl der erfolgreich geladenen Datensätze entspricht der Anzahl der Zeilen in der CSV-Datei, die Sie importieren. zu meinem Verständnis, wenn der COPY-Befehl fehlschlägt, wird nichts importiert, so müssen Sie die "gebrochene" Zeile reparieren und es erneut versuchen. –

+0

Siehe auch meine aktualisierte Antwort –