2017-10-12 76 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

如果沒有這臺機器上運行的其他東西那麼內存不應該是一個問題。試一試。在執行期間監視內存使用情況。也可以使用「加載」來查看系統上的壓力。