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 时出错