【发布时间】:2020-04-17 13:52:11
【问题描述】:
我想创建一个函数,以尽可能高效地将可能较大的数据帧(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 但您根本不应该使用循环进行插入。使用 Snowflake 提供的本机函数,例如
COPY INTO...etc,这将更有效。如果这不起作用,那么另一种方法是使用单个insert语句批量插入 -
我注意到 dbSendUpdate 能够发送的记录数有限制,因此会出现循环。你知道批量插入是否受到同样的影响吗?
-
@mad_ 对
COPY INTO的建议是将数据最快地导入 Snowflake 的正确方法。让 R 将数据放到 blob 存储上的文件中,然后使用COPY INTO将其放入 Snowflake。任何形式的INSERT语句都不会那么有效,尤其是对于较大的数据集。
标签: python sql r database snowflake-cloud-data-platform