PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

RPostgreSQL - Connexion R à Amazon Redshift - Comment écrire/publier des ensembles de données plus volumineux

Il est peut-être trop tard pour l'OP, mais je posterai ceci ici pour référence future si quelqu'un trouve le même problème :

Les étapes pour effectuer une insertion groupée sont :

  • Créer une table dans Redshift avec la même structure que ma trame de données
  • Diviser les données en N parties
  • Convertir les parties dans un format lisible par Redshift
  • Téléchargez toutes les pièces sur Amazon S3
  • Exécuter l'instruction COPY sur Redshift
  • Supprimez les fichiers temporaires sur Amazon S3

J'ai créé un package R qui fait exactement cela, sauf pour la première étape, et il s'appelle redshiftTools :https ://github.com/sicarul/redshiftTools

Pour installer le package, vous devrez faire :

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

Ensuite, vous pourrez l'utiliser comme ceci :

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 tronque la table cible, puis la charge entièrement à partir du bloc de données, ne le faites que si vous ne vous souciez pas des données actuelles qu'il contient. D'autre part, rs_upsert_table remplace les lignes dont les clés coïncident et insère celles qui n'existent pas dans la table.