我编写了一个以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而没有任何问题。
任何想法为什么会发生这种情况?
答案 0 :(得分:3)
感谢您的帮助。问题很简单。
我使用file.write()
在本地磁盘上编写文件,然后将其复制到S3。
所以在复制到S3之前,我需要使用file.close()
来关闭文件,我没有这样做。
是的,这很愚蠢:)
答案 1 :(得分:1)
如果在行13204处有NULL字节0x00,您应该仔细观察。我已经看到了那些导致不同类型的加载错误的字段中间的字节。要检查,您可以使用NULL AS'\ 000'选项绕过它们或使用十六进制编辑器来读取文件。请注意,普通编辑器可能不会显示空字节。
答案 2 :(得分:0)
我在Redshift CSV上传脚本中采用了类似的方法。 你可以用它来做健全检查"或者为您正在处理的脚本绘制性能基线。
脚本将:
12Mb / 50k行文件的示例输出:
S3 | data.csv.gz | 100%
Redshift | test2 | DONE
Time elapsed: 5.7 seconds