PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

RPostgreSQL – R-Verbindung zu Amazon Redshift – So schreiben/posten Sie größere Datensätze

Es kann für das OP zu spät sein, aber ich werde dies hier als zukünftige Referenz posten, falls jemand das gleiche Problem findet:

Die Schritte für eine Masseneinfügung sind:

  • Erstellen Sie eine Tabelle in Redshift mit der gleichen Struktur wie mein Datenrahmen
  • Teilen Sie die Daten in N Teile auf
  • Konvertieren Sie die Teile in ein von Redshift lesbares Format
  • Laden Sie alle Teile auf Amazon S3 hoch
  • Führen Sie die COPY-Anweisung auf Redshift aus
  • Löschen Sie die temporären Dateien auf Amazon S3

Ich habe ein R-Paket erstellt, das genau das tut, mit Ausnahme des ersten Schritts, und es heißt redshiftTools:https://github.com/sicarul/redshiftTools

Um das Paket zu installieren, müssen Sie Folgendes tun:

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

Danach können Sie es wie folgt verwenden:

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 schneidet die Zieltabelle ab und lädt sie dann vollständig aus dem Datenrahmen, tun Sie dies nur, wenn Sie sich nicht um die aktuellen Daten kümmern, die sie enthält. Andererseits rs_upsert_table ersetzt Zeilen mit übereinstimmenden Schlüsseln und fügt diejenigen ein, die nicht in der Tabelle vorhanden sind.