2016-04-06 3 views
1

При выполнении команды COPY, несколько сведений печатаются, как:Определения Redshift COPY неудачи записей в Рубине

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. 

И мне нужно обнаружение неисправных записей.

Таким образом, мне нужно 2 вещи:

  • определить, когда не удается строки: сейчас, это только распечатанные на экране, и я не знаю, как получить сообщение в коде.
  • Определите неисправные строки.

Один из способов сделать это было бы, чтобы получить доступ к query идентификатор, который виден в таблице stl_load_errors, но я понятия не имею, как получить к нему доступ с помощью кода.

(я в настоящее время используют pg камень для подключения к красным смещениям)

ответ

1

stl_load_errors таблица в Redshift, что (как вы уже догадались) включает в себя все ошибки, которые происходят при загрузке в Redshift. Таким образом, вы можете запросить его, делая что-то вроде:

SELECT * FROM stl_load_errors 

Теперь, чтобы ответить на ваши вопросы использовать следующий фрагмент:

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 

Это должно вывести всю информацию, вам нужно, вспомнить переменную как redshift, table , columns, s3_bucket, s3_key, access_key_id и secret_access_key зависят от вашей конфигурации.

UPDATE:

Чтобы ответить на ваш комментарий ниже, более конкретно, можно использовать запрос следующим образом:

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

Выглядит хорошо, еще одна вещь, у вас есть какие-либо идеи, чтобы получить количество успешно загруженных записей? (в этом случае 22666, который напечатан «Я не знаю, как»). – Drico

+0

Число успешно загруженных записей - это то же количество строк в импортированном CSV; к моему пониманию, если команда COPY не получает ничего импортированного, поэтому вам нужно исправить «сломанную» строку и повторить попытку. –

+0

Также см. Мой обновленный ответ –

Смежные вопросы