如何有效地将数据从R上传到SQL数据库(Snowflake)



我想创建一个函数,尽可能高效地将一个潜在的大数据帧(1M行以上(从R上传到Snowflake。下面的代码是我目前的方法,我将数据帧分解为100条记录的块,并通过dbSendUpdate循环执行100行的迭代,再加上剩余的行。对于一个大的数据帧来说,这通常需要很长时间,有没有更有效的方法可以代替?

upload_func <- function (dataframe) {
for (i in 0:(nrow(dataframe)/100 - (nrow(dataframe)/100)%%1)) {
if (100*(i + 1) <= nrow(dataframe)) {
b <- 100*i + 1
e <- 100*(i + 1)
values <- paste0(apply(dataframe[b:e,], 1, function(x) paste0("('", paste0(x, collapse = "', '"), "')")), collapse = ", ")
dbSendUpdate(connection, paste0("INSERT INTO database_table
VALUES ", values, ";"))
}
else {
values <- paste0(apply(dataframe[(i*100 + 1):(i*100 + nrow(dataframe)%%100), ], 1, function(x) paste0("('", paste0(x, collapse = "', '"), "')")), collapse = ", ")
dbSendUpdate(connection, paste0("INSERT INTO database_table 
VALUES ", values, ";"))
}
}

}

要获得最佳性能,请不要直接从R插入。将数据帧写入云存储中的csv文件,创建指向此位置的外部阶段,然后使用COPY INTO。这将利用并行处理来获取数据。为了优化加载的并行操作数量,建议生成大约100-250 MB压缩的数据文件。

最新更新