将数据从本地复制到S3到Redshift表时发出问题

时间:2015-03-23 09:45:37

标签: python csv amazon-s3 boto amazon-redshift

我编写了一个以csv格式生成数据的程序,然后将该数据上传到S3,最终将副本复制到Redshift表。这是代码

bucket2 = self.s3Conn.lookup('my-bucket')
    k = Key(bucket2)

    ## Delete existing
    key_del = bucket2.delete_key("test_file.csv")

    ## Create new key and upload file to s3
    k.Key = "test_file.csv"
    k.name = "test_file.csv"
    k.set_contents_from_filename('test_file.csv')

    ## Move file from S3 to redshift

    logging.info("\nFile Uploaded to S3 bucket\n")

    try:

        self.newCur.execute("Truncate test_file")

        self.newCur.execute("COPY test_file FROM 's3://my-bucket/test_file.csv' credentials 'aws_access_key_id=xxxxxx;aws_secret_access_key=xxxxxx DELIMITER ','; ")

    except psycopg2.DatabaseError, e:
        logging.exception("Database exception ")

文件有大约13500行,10列。 我验证了redhshift具有相同数量的列和数据类型

但是,每次它在13204行之后断开,并且“stl_load_errors”表中的错误为“Delimited not found”。第13204行中的数据无关紧要,因为我还使用其他值更新了该行。

所以我检查S3存储桶以检查我的csv文件。我下载了复制到S3存储桶的文件。我看到的是该文件没有完全复制。它通常会突破811007个字符。

之前我已将较大的文件上传到S3而没有任何问题。

任何想法为什么会发生这种情况?

3 个答案:

答案 0 :(得分:3)

感谢您的帮助。问题很简单。

我使用file.write()在本地磁盘上编写文件,然后将其复制到S3。 所以在复制到S3之前,我需要使用file.close()来关闭文件,我没有这样做。

是的,这很愚蠢:)

答案 1 :(得分:1)

如果在行13204处有NULL字节0x00,您应该仔细观察。我已经看到了那些导致不同类型的加载错误的字段中间的字节。要检查,您可以使用NULL AS'\ 000'选项绕过它们或使用十六进制编辑器来读取文件。请注意,普通编辑器可能不会显示空字节。

答案 2 :(得分:0)

我在Redshift CSV上传脚本中采用了类似的方法。 你可以用它来做健全检查"或者为您正在处理的脚本绘制性能基线。

尝试CSV_Loader_For_Redshift

脚本将:

  • 压缩并将文件上传到S3
  • 将数据附加到Redshift表。

12Mb / 50k行文件的示例输出:

S3        | data.csv.gz | 100% 
Redshift  | test2       | DONE 
Time elapsed: 5.7 seconds