Có thể đã quá muộn đối với OP, nhưng tôi sẽ đăng bài này ở đây để tham khảo trong tương lai nếu ai đó phát hiện ra vấn đề tương tự:
Các bước để thực hiện chèn hàng loạt là:
- Tạo một bảng trong Redshift có cùng cấu trúc với khung dữ liệu của tôi
- Chia dữ liệu thành N phần
- Chuyển đổi các phần thành định dạng có thể đọc được bằng Redshift
- Tải tất cả các phần lên Amazon S3
- Chạy câu lệnh COPY trên Redshift
- Xóa các tệp tạm thời trên Amazon S3
Tôi đã tạo Gói R thực hiện chính xác điều này, ngoại trừ bước đầu tiên và nó được gọi là redshiftTools: https://github.com/sicarul/redshiftTools
Để cài đặt gói, bạn cần thực hiện:
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")
Sau đó, bạn sẽ có thể sử dụng nó như sau:
Thư việnlibrary("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
cắt ngắn bảng mục tiêu và sau đó tải nó hoàn toàn từ khung dữ liệu, chỉ thực hiện việc này nếu bạn không quan tâm đến dữ liệu hiện tại mà nó nắm giữ. Mặt khác, rs_upsert_table
thay thế các hàng có khóa trùng nhau và chèn những hàng không tồn tại trong bảng.