是否有任何性能更好的选择将数据导出到本地,而不是通过s3从Redshift卸载?

时间:2018-05-25 01:37:24

标签: amazon-s3 amazon-redshift

我正在开发一个需要将Redshift表数据导出到本地单个CSV文件的Spring项目。目前的方法是:

  1. 执行Redshift UNLOAD,通过JDBC
  2. 将数据跨多个文件写入S3
  3. 将所述文件从S3下载到本地
  4. 将它们合并为一个CSV文件
  5. UNLOAD (
      'SELECT DISTINCT #{#TYPE_ID} 
      FROM target_audience 
      WHERE #{#TYPE_ID} is not null 
      AND #{#TYPE_ID} != \'\' 
      GROUP BY #{#TYPE_ID}'
    ) 
    TO '#{#s3basepath}#{#s3jobpath}target_audience#{#unique}_' 
    credentials 'aws_access_key_id=#{#accesskey};aws_secret_access_key=#{#secretkey}' 
    DELIMITER AS ',' ESCAPE GZIP ;
    

    上述方法一切都很好。但我认为可以通过跳过S3部分并直接从Redshift获取数据到本地来提高整体性能。

    在搜索在线资源后,我发现您可以export data from redshift directly through psqlto perform SELECT queries and move the result data myself。但这两种选择都不能通过并行写入来实现Redshift UNLOAD的性能。

    那么有什么方法可以模仿UNLOAD并行写入来实现相同的性能而无需经过S3?

2 个答案:

答案 0 :(得分:0)

您可以使用UNLOAD PARALLEL OFF参数来避免将文件连接在一起。它只输出一个文件。

但是,如果文件大小超过6.2GB,则会创建多个文件。

请参阅:UNLOAD - Amazon Redshift

通过运行psql来获得更好的性能是值得怀疑的,但如果性能对您很重要,那么您当然可以测试各种方法。

答案 1 :(得分:0)

我们和你在这里做的完全相同。在我们的性能比较中,在我们的用户案例中,它发现在某些情况下几乎相同甚至更好。因此编程和调试很容易。因为实际上只有一步。

//replace user/password,host,region,dbname appropriately in given command
psql postgresql://user:password@xxx1.xxxx.us-region-1.redshift.amazonaws.com:5439/dbname?sslmode=require -c "select C1,C2 from sch1.tab1" > ABC.csv

这使我们能够避免3个步骤,

  1. 使用JDBC卸载
  2. 从S3下载导出的数据
  3. 解压缩gzip文件,(我们以前用来保存网络输入/输出)。
  4. 另一方面也节省了一些成本(S3存储虽然可以忽略不计)。 顺便说一下,pgsql(9.0+)以后,sslcompression是默认on