6

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

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

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

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

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

PS任何帮助/线索将不胜感激。我会努力工作。只需要提个醒。

4

5 回答 5

6

这似乎现在可能(自 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 集群)

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

[...]

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

副本是从(redshift 集群)(postgres 集群)

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 的首选方法(与复制相反,或者更糟糕的是,使用 ORM 将数据加载到内存中)

于 2016-08-29T16:59:31.620 回答
2

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

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

于 2015-06-02T09:05:14.977 回答
1

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

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

我在PostgreSQL-to-Redshift-Data-Loader中做到了这一点

于 2016-09-09T15:10:26.340 回答
0

如果您在两个不同的集群中拥有表,那么最好将 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’;
于 2018-02-08T13:18:15.967 回答
0

这是完整的 shell 脚本- 将导出从 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;"
于 2017-02-04T11:38:06.523 回答