python - 如何有效地将数据从 R 上传到 SQL 数据库(雪花)?
问题描述
我想创建一个函数,以尽可能有效地将潜在的大数据帧(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 压缩的数据文件。
推荐阅读
- security - 零知识证明性能的安全性
- reactjs - 在 Map 函数中设置状态后,如何仅将状态作为道具传递一次
- javascript - 通过中间服务器从浏览器获取文件时,multer 无法正常工作
- sql-server - 如何在 SQL Server 中执行 PIVOT 对多列进行聚合
- r - 方法=“QDA”和值=“finalModel”的train()错误
- javascript - 如何从 js 中获取数据?
- java - 如何将 xml 文件和 java 链接到我的节点 js?
- angular - CRUD 演示项目
- c# - 我可以安装一个 HttpModule (IIS) 来激活特定的动词吗?
- python - 与 pandas 中的多个数据表进行比较(python)