4

我正在尝试如何将 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 方式 - 关于如何上传/插入批量数据的任何建议表示赞赏 - 谢谢!

完整代码在这里:

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:如果我弄清楚了,会发布更新

4

1 回答 1

3

对于 OP 来说可能为时已晚,但如果有人发现相同的问题,我会在此处发布以供将来参考:

批量插入的步骤是:

  • 在 Redshift 中创建一个与我的数据框结构相同的表
  • 将数据拆分为 N 个部分
  • 将部分转换为 Redshift 可读的格式
  • 将所有部件上传到 Amazon S3
  • 在 Redshift 上运行 COPY 语句
  • 删除 Amazon S3 上的临时文件

我创建了一个 R 包,除了第一步之外,它就是这样做的,它被称为 redshiftTools: https ://github.com/sicarul/redshiftTools

要安装该软件包,您需要执行以下操作:

install.packages('devtools')
devtools::install_github("RcppCore/Rcpp")
devtools::install_github("rstats-db/DBI")
devtools::install_github("rstats-db/RPostgres")
devtools::install_github("hadley/xml2")
install.packages("aws.s3", repos = c(getOption("repos"), "http://cloudyr.github.io/drat"))
devtools::install_github("sicarul/redshiftTools")

之后,您将能够像这样使用它:

library("aws.s3")
library(RPostgres)
library(redshiftTools)

con <- dbConnect(RPostgres::Postgres(), dbname="dbname",
host='my-redshift-url.amazon.com', port='5439',
user='myuser', password='mypassword',sslmode='require')

rs_replace_table(my_data, dbcon=con, tableName='mytable', bucket="mybucket")
rs_upsert_table(my_other_data, dbcon=con, tableName = 'mytable', bucket="mybucket", keys=c('id', 'date'))

rs_replace_table截断目标表,然后从数据框中完全加载它,只有在您不关心它保存的当前数据时才这样做。另一方面,rs_upsert_table替换具有重合键的行,并插入表中不存在的行。

于 2016-09-23T03:38:35.160 回答