【问题标题】:RPostgreSQL - R Connection to Amazon Redshift - How to WRITE/Post Bigger Data SetsRPostgreSQL - R 连接到 Amazon Redshift - 如何编写/发布更大的数据集
【发布时间】:2015-08-26 09:55:57
【问题描述】:

我正在尝试如何将 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-what-you-need-to-know/ 的加载数据部分

它注释

既然我们已经创建了数据结构,我们如何将数据放入其中?你有两个选择: 1) 亚马逊 S3 2) 亚马逊 DynamoDB 是的,您可以简单地运行一系列 INSERT 语句,但这会非常缓慢。 (!)

Amazon 推荐使用 S3 方法,我将简要介绍一下。我不认为 DynamoDB 特别有用,除非您已经在使用它并希望将部分数据迁移到 Redshift。

从本地网络获取数据到 S3.....

RA:如果我弄清楚了会发布更新

【问题讨论】:

    标签: r postgresql amazon-redshift rodbc rpostgresql


    【解决方案1】:

    对于 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 替换具有重合键的行,并插入表中不存在的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多