redshift data.frame 没有被写入

Posted

技术标签:

【中文标题】redshift data.frame 没有被写入【英文标题】:redshift data.frame not getting written 【发布时间】:2013-10-02 03:50:28 【问题描述】:

我能够使用 RPostgreSQL 包连接到 AWS redshift 集群;读取表,甚至使用 SQL - dbGetQuery 创建表。但是,如果我尝试如下编写一个 data.frame(其中 con 是一个 dbConnect 对象到 redshift 中,如果是一个简单的 data.frame 则为 newdf

dbWriteTable(con,"newtb",newdf)

我收到以下错误:

postgresqlgetResult(new.con) 中的错误:RS-DBI 驱动程序:(不能 检索结果:错误:不支持加载源。 (暗示: 仅允许基于 S3 或 DynamoDB 的负载)

我尝试了多个简单的 data.frames,而读取 data.frame 的作品却没有。提示告诉我使用 s3 进行加载,这意味着我可以在 R 中处理数据,但不能将 data.frame 写回 redshift,除非我使用显式插入。任何想法我做错了什么?或者如果这是 redshift 禁止或强制您使用 s3 的固有方式

【问题讨论】:

这是由于 RPostgreSQL::dbWriteTable 的工作方式造成的 - 相反,您需要自己创建 SQL(CREATE TABLE、INSERT INTO、...)并将其发送到数据库。 谢谢哈德利。创建 SQL 并插入正在工作。假设由于 redshift 对 postgresql 的非标准(不同)实现,dbWriteTable 在这种情况下无法工作 是的,postgresql 支持 COPY INTO STDIN 而 redshift 不支持(它只支持从 S3 或 dynamodb 加载) @hadley 您能否详细说明您的评论?您是说需要将插入语句构造为 SQL 查询? @Zach 是的,对。 RPostgreSQL 用于将数据加载到 postgres 的方式不适用于 redshift 【参考方案1】:

我使用 RODBC 包解决了。

您需要建立一个 ODBC 连接,我们称之为 redshift_con。从 R 比你需要创建一个连接(我称之为 ch)使用:

ch

在 R 中加载我的数据框并运行:

sqlSave(ch, mydataframename, addPK = TRUE, verbose = TRUE)

然后 R 在 redshift 中创建一个名为“mydataframename”的新表。速度不是很快,如果找到优化方法我会持续更新。

如果您需要更多信息,请参阅http://cran.r-project.org/web/packages/RODBC/index.html

################ SAMPLE CODE FOR TESTING ##############
install.packages("RODBC")
library('RODBC')
ch <- odbcConnect("redshift_con", uid = "admin", pwd = "********")
sqlColumns(ch, "public.r_test")
USArrest<-data(USArrests)
sqlSave(redshift_con, USArrests, rownames = "State", addPK = TRUE, verbose = TRUE)
I'll post a comment on the process speed.

希望对你有帮助。

更新

仅适用于非常少量的数据

【讨论】:

以上是关于redshift data.frame 没有被写入的主要内容,如果未能解决你的问题,请参考以下文章

r 将R data.frame写入Tableau数据提取文件(.tde)

r 将R data.frame写入Tableau数据提取文件(.tde)

将 R data.frame 强制转换为 nz.data.frame 时出错

无法使用 Spark 2.4.3 写入 Redshift

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

通过 rodbc 写入 mysql 数据库的 posix 被截断