2017-10-12 32 views
0

我要运行查询,从Redshift返回一个巨大的表(大约700Mb),并使用本地计算机上的SQLAlchemy和python 2.7将其保存为CSV(mac pro)。 我从来没有这样做过这么大的查询之前,显然可能有一些内存和其他问题。Python/SQLAlchemy:如何将巨大的红移表保存为CSV?

我的问题是我将考虑到以及如何使用sql炼金术,以使该过程的工作?

谢谢, 亚历克斯

+0

你是不是想改变数据以任何方式倾倒? – brddawg

回答

3

理想情况下,您可以使用UNLOAD命令将其移至S3存储,然后将其存入本地计算机。这里有一个例子:

UNLOAD ('select * from my_table') 
    TO 's3://bucket_name/path/to/my_filename_prefix' 
    WITH CREDENTIALS 
    'aws_access_key_id=<my_access_key>; 
    aws_secret_access_key=<my_secret_key>' 
    MANIFEST 
    GZIP 
    ALLOWOVERWRITE 
    ESCAPE 
    NULL AS '\\N' 

裁判http://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD_command_examples.html

如果本地查询的唯一或最佳的选择,这里有两件事情要限制使用内存:

  1. 最大限度地降低运营

  2. 一次循环查询一个结果

下面是一个例子片断,如果编辑都做你的数据:

result = conn.execute(s) 
row = result.fetchone() 

with open(outfile, 'ab') as csvfile: 
    while row is not None: 
     csvfile.write(txt) 
     row = result.fetchone() 

否则只是写的所有行:

# dump column titles (optional) 
csvfile.writerow(x[0] for x in cursor.description) 
# dump rows 
csvfile.writerows(cursor.fetchall()) 

outfile.close() 

片断信用:https://stackoverflow.com/a/2952829/7853322

0

如果没有这台机器上运行的其他东西那么内存不应该是一个问题。试一试。在执行期间监视内存使用情况。也可以使用“加载”来查看系统上的压力。