识别Ruby中的Redshift COPY失败记录

时间:2016-04-06 10:23:11

标签: ruby copy amazon-redshift pg

执行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.

我需要找出失败的记录。

因此我需要两件事:

  • 确定何时出现故障行:现在,它只打印在屏幕上,我不知道如何通过代码获取消息。
  • 确定失败的行。

这样做的一种方法是访问表query中可见的stl_load_errors标识符,但我不知道如何通过代码访问它。

(我目前使用pg gem连接到redshift)

1 个答案:

答案 0 :(得分:2)

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

这应输出您需要的所有信息,调用redshifttablecolumnss3_buckets3_keyaccess_key_id等变量,secret_access_key取决于您的配置。

更新:

要回答下面的评论,更具体地说,您可以使用以下查询:

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