2017-08-09 66 views
1

我希望能够在mySQL中使用load data infile命令,而不是从本地文件加载数据我想从CSV文件加载它。将数据从s3加载到运行EC2实例(不是RDS)的mySQL

即,如果该文件是在本地存储它会看起来像:

LOAD DATA INFILE'C:\\abc.csv' INTO TABLE abc 

但如果它是在S3中,不知道我怎么会做这样的事情。

这可能吗?

注意:这不是一个RDS的机器,所以这个命令似乎不工作: http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-template-copys3tords.html

+3

您可以将S3文件复制到本地位置 - 即与[aws cli](https://aws.amazon.com/cli/)运行类似's3 cp s3://bucket/file.csv C:\\某处\ file.csv'? – stdunbar

+0

@stdunbar谢谢。是的,我可以,但不应该有办法避免不必要的数据复制和数据传输?这就是这个问题的目标。我正在传输TB数据,这样复制会带来额外的成本和时间。 – Dnaiel

+0

最终,你正在寻找从S3流数据到数据库,并没有一些代码,你不能直接做到这一点。问题是MySQL命令行不会从S3流出。另外一种选择是将S3安装为文件系统(类似[s3fs-fuse](https://github.com/s3fs-fuse/s3fs-fuse))。这使得S3看起来像一个文件系统。 – stdunbar

回答

0

mysql CLI允许你执行STDIN作为SQL语句的流。

通过组合使用s3 CLI和mkfifo,可以将数据从s3中流出。

然后,将流重新格式化为有效的SQL是一件简单的事情。

mkfifo /tmp/mypipe 
s3 cp s3://your/s3/object /tmp/mypipe 
python transform_csv_to_sql.py < /tmp/mypipe | mysql target_database 

您可能能够删除蟒蛇步骤和使用MySQL的CSV代码,如果你告诉MySQL到的数据直接从FIFO加载:

mkfifo /tmp/mypipe 
s3 cp s3://your/s3/object /tmp/mypipe 
mysql target_database --execute "LOAD DATA INFILE '/tmp/mypipe'" 

祝你好运!

相关问题