Może być już za późno na OP, ale opublikuję to tutaj do wykorzystania w przyszłości, jeśli ktoś znajdzie ten sam problem:
Kroki do wykonania wstawiania zbiorczego to:
- Utwórz tabelę w Redshift o takiej samej strukturze jak moja ramka danych
- Podziel dane na N części
- Konwertuj części na format czytelny dla Redshift
- Prześlij wszystkie części do Amazon S3
- Uruchom oświadczenie COPY na Redshift
- Usuń pliki tymczasowe w Amazon S3
Stworzyłem pakiet R, który robi dokładnie to, z wyjątkiem pierwszego kroku i nazywa się redshiftTools:https://github.com/sicarul/redshiftTools
Aby zainstalować pakiet, musisz wykonać:
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")
Później będziesz mógł z niego korzystać w ten sposób:
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
obcina tabelę docelową, a następnie ładuje ją całkowicie z ramki danych, rób to tylko wtedy, gdy nie zależy Ci na bieżących danych, które przechowuje. Z drugiej strony rs_upsert_table
zastępuje wiersze, które mają zbieżne klucze i wstawia te, które nie istnieją w tabeli.