PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

RPostgreSQL - R Connection to Amazon Redshift - Como escrever/postar conjuntos de dados maiores


Pode ser tarde demais para o OP, mas postarei isso aqui para referência futura se alguém encontrar o mesmo problema:

As etapas para fazer uma inserção em massa são:
  • Criar uma tabela no Redshift com a mesma estrutura do meu quadro de dados
  • Divida os dados em N partes
  • Converta as partes em um formato legível pelo Redshift
  • Faça upload de todas as partes para o Amazon S3
  • Execute a instrução COPY no Redshift
  • Excluir os arquivos temporários no Amazon S3

Eu criei um pacote R que faz exatamente isso, exceto pela primeira etapa, e é chamado redshiftTools:https://github.com/sicarul/redshiftTools

Para instalar o pacote, você precisará fazer:
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")

Depois disso, você poderá usá-lo assim:
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 trunca a tabela de destino e a carrega inteiramente do quadro de dados, faça isso apenas se você não se importar com os dados atuais que ela contém. Por outro lado, rs_upsert_table substitui as linhas que possuem chaves coincidentes e insere aquelas que não existem na tabela.