【问题标题】:Amazon Redshift: Copying Data Between DatabasesAmazon Redshift:在数据库之间复制数据
【发布时间】:2015-08-14 22:33:39
【问题描述】:

我希望在 Amazon Redshift 上的数据库中复制数据。在此之前,我将数据从 Redshift 数据库复制到托管在 EC2 实例上的 PostgreSQL 以进行分析。我有 ruby​​ 脚本,可以使用 dblink EXTENSION 来完成。

但现在由于数据在 PostgreSQL 实例上无法管理,我们决定将数据复制到同一 Redshift 集群上的单独数据库中。

撞!我发现 dblink 不适用于 Postgre 8.0(Redshift 版本)。有没有办法让我在 Redshift 上工作。

我不想使用复制命令并在中间甚至数据管道之间添加一层 S3。你看,它是同一个集群,只是不同的数据库。

万一没有其他办法,我应该使用数据管道还是复制到 S3,然后再回到 Redshift。还是说到底本质上是一样的?

附:任何帮助/线索将不胜感激。我会努力工作。只是需要提醒一下。

【问题讨论】:

    标签: postgresql amazon-web-services amazon-s3 amazon-redshift amazon-data-pipeline


    【解决方案1】:

    这似乎现在可以实现(自 2016 年 6 月 3 日起)

    见:https://blogs.aws.amazon.com/bigdata/post/Tx1GQ6WLEWVJ1OX/JOIN-Amazon-Redshift-AND-Amazon-RDS-PostgreSQL-WITH-dblink

    在上面的文章中,他们给出了一个从redshift复制到另一个数据库的例子:

    为了清楚起见,我将使用 (postgres cluster) 和 (redshift cluster) 进行注释

    将数据从 Amazon Redshift 复制到 RDS PostgreSQL

    创建表的SQL:(postgres cluster)

    CREATE TABLE sales_summary (
       saletime timestamp,
       sellerid int,
       sales decimal
    );
    

    [...]

    以下查询显示了如何使用 dblink 函数将数据插入到表中:

    拷贝是从(redshift cluster)(postgres cluster)

    INSERT INTO sales_summary
    SELECT *
    FROM dblink('foreign_server',$REDSHIFT$
        SELECT date_trunc('hours', saletime) AS ts, sellerid, sum(pricepaid) sales
        FROM sales 
        WHERE saletime >= '2008-01-01'
        AND saletime < '2008-02-01'
        GROUP BY ts, sellerid 
        ORDER BY sales 
    $REDSHIFT$) AS t1 (saletime timestamp, sellerid int, sales decimal);
    

    编辑:我已经在生产中使用它来加载每天数百万行的表,我还没有遇到过一个与之相关的问题。所以我会推荐它作为从 Redshift 加载到 RDS-postgres 的首选方法(而不是 COPYing,或者更糟糕的是,使用 ORM 将数据加载到内存中)

    【讨论】:

    • 问题是关于从 Redshift 数据库复制到同一 Redshift 集群上的 Redshift 数据库,但这个答案是关于从 postgres 数据库复制。
    • @rado。是的,我没有仔细阅读。在这种情况下,UNLOAD then COPY 似乎是首选方式(即使 OP 想要不同的方式)。
    【解决方案2】:

    在查询中无法同时访问来自两个不同数据库的表。

    您应该使用卸载命令将数据库中的数据卸载到 s3,然后使用复制命令将其加载到新的数据库表中。

    【讨论】:

    • 使用 AWS Data Pipeline 怎么样?
    【解决方案3】:

    您可以使用 Python/psycopg2/boto 编写此管道的脚本。

    • Python 连接到源 PostgreSQL 并打开数据管道 读。
    • 使用多部分压缩数据流并将其泵送到 S3 上传。
    • 使用 COPY 命令将数据从 S3 加载到 Redshift

    我在 PostgreSQL-to-Redshift-Data-Loader 中就是这样做的

    【讨论】:

      【解决方案4】:

      Here's the complete shell script - 将导出从 MySQL 更改为 PostgreSQL

      s3bucket=s3://yours3bucket/yourfolder
      aws s3 ls $s3bucket/yourtable.txt.gz
      aws s3 cp /tmp/yourtable.txt.gz $s3bucket/yourtable.txt.gz   
      aws s3 ls $s3bucket/yourtable.txt.gz
      if [ "$?" = "0" ];
       then
         echo "File sucessfully uploaded to S3 bucket."
       else
         echo "Upload to S3 bucket failed." 
      fi
      

      将文件从 PostgreSQL 导出到 Amazon S3 后,您可以这样做:

      psql -U$postgres_user -h $postgres_host -p $postgres_port $redshift_database -c 
      "copy yourdatabase.yourtable from '$s3bucket/yourtable.txt.gz' credentials 
      'aws_access_key_id=ajgaslgkshtasj; aws_secret_access_key=shfs/34fiethajthaslthksthask'
      delimiter '|' gzip removequotes ESCAPE ACCEPTINVCHARS ACCEPTANYDATE;"
      

      【讨论】:

        【解决方案5】:

        如果您在两个不同的集群中拥有表,那么最好将 S3 放在中间。优势在于,如果数据量很大,将数据从 S3 复制到 Redshift 将比从本地客户端复制到 Redshift 快得多。由于在 aws 服务之间使用并行处理,因此速度更快。

        步骤是这样的。

        1) 从 SQL Workbench/j -> Database Explorer -> Table -> 右键 -> Export Data -> Type(Text) & Field delimiter (, comma) 下载数据为文件(txt)

        2) 将文件扩展名重命名为 CSV 并上传到指定文件夹的 S3 存储桶中。

        3) 现在登录到您的数据库(通过 SQL Workbench/j )并运行以下命令。

        copy fact_transaction from ‘s3://bucket_name/folder_name’
        CREDENTIALS ‘aws_access_key_id=XXXXXXX;aws_secret_access_key=YYYYYYYY’
        delimiter ‘,’
        csv
        region ‘us-east-1’;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-03
          • 2018-09-12
          • 1970-01-01
          • 1970-01-01
          • 2022-08-03
          • 2021-08-16
          • 1970-01-01
          相关资源
          最近更新 更多