如何使用 ruby​​ 将单个记录写入 Redshift 数据库?

Posted

技术标签:

【中文标题】如何使用 ruby​​ 将单个记录写入 Redshift 数据库?【英文标题】:How to use ruby to write individual records to a Redshift database? 【发布时间】:2014-06-26 19:05:24 【问题描述】:

目前,我们有一个脚本可以解析数据并一次将一条记录上传到 mysql 数据库。最近,我们决定改用 aws redshift。

有没有办法可以使用我的亚马逊登录凭据和我的 redshift 集群信息将这些记录直接上传到 redshift 数据库?

我在网上找到的所有指南都建议从 S3 存储桶导入文本或 csv 文件,但这对我的用例来说不太实用。

感谢您的帮助

我想做这样的事情:

require 'aws-sdk'
require 'pg'

AWS.config(access_key_id: 'my_access_key_id', secret_access_key: 'my_secret_access_key', region: 'us-west-2')

redshift = AWS::Redshift.new

credentials = 
    driver: "org.postresql.Driver"
    url: "my_connect_url"
    username: "my_username"
    password: "my_password"
    database: "my_db"


db = redshift.connect(credentials) # **NOT A REAL LINE OF CODE, I WISH IT WAS**

sql_query = "INSERT INTO my_table (my_column) 
        VALUES ('hello world'); " 

db.query(sql_query)
db.close

【问题讨论】:

【参考方案1】:

实际上,您应该在 S3 中一次插入一条记录。然后定期加载该文件。 Redshift 在加载 100,000 行文件时效率更高,然后说一个接一个地输入 100 行数据(根据我的经验粗略估计......)。如果您真的想逐条记录插入内容,您可以使用任何标准的 PSQL ruby​​ 连接器来执行此操作。可以使用 jdbc/odbc psql 驱动程序连接 Redshift。有点像您编写的示例程序。

我不建议这样做...但这里是插入文档 http://docs.aws.amazon.com/redshift/latest/dg/r_INSERT_30.html

我会查看这个关于附加到 s3 文件的问题。这真的是你想要做的......

Ruby - Append content at the end of the existing s3 file using fog

编辑 所以我有点跳到那个问题没有阅读答案.... 所以更正,你需要在本地创建文件,一旦达到一定大小就上传到s3,然后redshift load命令。

这里用于加载到 redshift http://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-S3.html

或者....您可以尝试从远程主机加载数据...我以前从未这样做过,但它基本上跳过了 s3 加载部分,但您仍然希望移动一个大文件。 http://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-remote-hosts.html

最后,如果您真的想要逐条记录插入,您可能应该使用 RDS 而不是 Redshift,除非您的数据集很大,否则您将获得更好的性能。

好的,这是我对 ruby​​ 的尝试,但老实说,我以前从未做过 RUBY,但实际上它只是与 PSQL 数据库的连接。您正在尝试通过 AWS SDK 连接到 redshift,该 SDK 用于启动、调整大小和管理。为此应通过 JDBC/ODBC 驱动程序 sqlworkbench、psql linux cli 等连接到 redshift...

require 'pg'
host = 'redshift-xxxx.aws.com'
port = 5439
options = ''
tty = ''
dbname = 'myDB'
login = 'master'
password = 'M@st3rP@ssw0rd'
conn = PGconn.new(host, port, options, tty, dbname, login, password)

其中主机、端口、数据库名、登录名和密码都是在 redshift 午餐期间设置的。 DBname是psql的东西,你对psql了解多少?

【讨论】:

你能否分享一个可以通过 ruby​​ 编写任意查询的 ruby​​ 代码的 sn-p?我在 redshift api 中看不到任何“连接”或“查询”功能。否则,与示例插入语句的第一个链接将不相关。谢谢! 我已经尝试写 ruby​​,如有必要请清理,但我希望我的意思很清楚,不要使用 AWS sdk,使用 Ruby PSQL 连接器 最后一个问题,什么是“主机”?和 redshift 控制台上给出的端点一样吗? 还需要的 gem 是 'pg' 而不是 'pq' 您可能会为未来的访问者修改答案。在代码中为“主机”使用“端点”就像一个魅力:)

以上是关于如何使用 ruby​​ 将单个记录写入 Redshift 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中写入文件?

ruby 活动记录和迁移单个文件

如何防止写入特殊字符[重复]

如何使用 Ruby 将解压缩的数组转换为单个值?

Sinatra / Warden / Ruby - 如何确保我的用户只能使用单个会话登录?

ruby excel - 将数据写入现有的xls