PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

RPostgreSQL - Connessione R ad Amazon Redshift - Come SCRIVERE/pubblicare set di dati più grandi

Potrebbe essere troppo tardi per l'OP, ma lo posterò qui per riferimento futuro se qualcuno trova lo stesso problema:

I passaggi per eseguire un inserimento in blocco sono:

  • Crea una tabella in Redshift con la stessa struttura del mio frame di dati
  • Dividi i dati in N parti
  • Convertire le parti in un formato leggibile da Redshift
  • Carica tutte le parti su Amazon S3
  • Esegui l'istruzione COPY su Redshift
  • Elimina i file temporanei su Amazon S3

Ho creato un pacchetto R che fa esattamente questo, ad eccezione del primo passaggio, e si chiama redshiftTools:https://github.com/sicarul/redshiftTools

Per installare il pacchetto, dovrai fare:

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")

Successivamente, potrai usarlo in questo modo:

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 tronca la tabella di destinazione e quindi la carica interamente dal frame di dati, esegui questa operazione solo se non ti interessano i dati correnti che contiene. D'altra parte, rs_upsert_table sostituisce le righe che hanno chiavi coincidenti e inserisce quelle che non esistono nella tabella.