Python / SQLAlchemy:如何将巨大的红移表保存为CSV?

时间:2017-10-12 16:48:36

标签: python sql sqlalchemy amazon-redshift

我将运行查询,从Redshift返回一个巨大的表(大约700Mb)并使用我的本地机器上的SQLAlchemy和python 2.7将其保存为CSV(mac pro)。 我之前从未做过如此大规模的查询,显然可能存在一些记忆和其他问题。

我的问题是我将考虑什么以及如何使用sql炼金术来使这个过程有效?

谢谢, 亚历

2 个答案:

答案 0 :(得分: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'

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

如果本地查询是唯一或首选的选项,则有两件事限制内存使用:

  1. 尽量减少操作

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

  3. 如果对您的数据进行了修改,则以下是一个示例代码段:

    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

答案 1 :(得分:0)

如果你不在该机上运行其他许多东西,那么内存应该不是问题。试试看。在执行期间监视内存使用情况。也可以使用&#34; load&#34;看看系统有什么压力。