我正在尝试如何将 R 与亚马逊的 Redshift 连接起来——并为其他新手发布一个简短的博客。
一些好的进展 - 我能够做大多数事情(创建表,选择数据,甚至 sqlSave 或 dbSendQuery '逐行' 但是,我还没有找到一种方法来一次完成表的批量上传(例如将整个 5X150 IRIS 表/数据框复制到 Redshift)——这不会超过一分钟。
问题:对于 RPostgreSQL 新手的任何关于如何将数据块写入/上传到 Redshift 的建议将不胜感激!
RODBC:colnames(iris) <- tolower(colnames(iris))
sqlSave(channel,iris,"iris", rownames=F)
慢!太慢了!一定是更好的方法 150 ~1.5 分钟
iris_results <- sqlQuery(channel,"select * from iris where species = 'virginica'") # fast subset. this does work and shows up on AWS Redshift Dashboard
sqlDrop(channel, "iris", errors = FALSE) # clean up our toys
RPostgreSQL
dbSendQuery(con, "create table iris_200 (sepallength float,sepalwidth float,petallength float,petalwidth float,species VARCHAR(100));")
dbListFields(con,"iris_200")
ONE BY ONE 向表中插入四行
dbSendQuery(con, "insert into iris_200 values(5.1,3.5,1.4,0.2,'Iris-setosa');")
dbSendQuery(con, "insert into iris_200 values(5.5,2.5,1.1,0.4,'Iris-setosa');")
dbSendQuery(con, "insert into iris_200 values(5.2,3.3,1.2,0.3,'Iris-setosa');")
dframe <-dbReadTable(con,"iris_200") # ok
dbRemoveTable(con,"iris_200") # and clean up toys
或循环遍历表(大约每秒 1 次)
for (i in 1:(dim(iris_200)[1]) ) {
query <- paste("insert into iris_200 values(",iris_200[i,1],",",iris_200[i,2],",",
iris_200[i,3],",",iris_200[i,4],",","'",iris_200[i,5],"'",");",sep="")
print(paste("row",i,"loading data >> ",query))
dbSendQuery(con, query)
}
简而言之,这是一种 hacky/slow 方式 - 关于如何上传/插入批量数据的任何建议表示赞赏 - 谢谢!
完整代码在这里:
- RPostgreSQL:https ://dreamtolearn.com/node/8OVIWY2C5RLZZSYD9OHCKM8AI/92
- GITHUB - rustyoldrake/RODBC_AWS_Redshift
PS - 收到此错误消息:不支持加载源。(提示:仅允许基于 S3 或 DynamoDB 或 EMR 的负载)
2015 年 6 月 12 日更新 - 可能无法以合理的速度直接加载批量数据,请注意上面的错误消息,并在此博客中注明 - http://dailytechnology.net/2013/08/03/redshift的加载数据部分-你需要知道的/
它指出
那么既然我们已经创建了数据结构,那么我们如何将数据放入其中呢?您有两个选择:1) Amazon S3 2) Amazon DynamoDB 是的,您可以简单地运行一系列 INSERT 语句,但这会非常缓慢。(!)
Amazon 推荐使用 S3 方法,我将简要介绍一下。我不认为 DynamoDB 特别有用,除非您已经在使用它并希望将部分数据迁移到 Redshift。
要将数据从本地网络获取到 S3 .....
RA:如果我弄清楚了,会发布更新