如何无需collect()直接导出duckdb的tbl_duckdb_connection对象为CSV
解决方案
你可以使用duckdb::duckdb_write_csv()函数,直接将lazy查询的结果导出为CSV,无需调用collect()把数据加载到R内存中,也不需要用到dbExecute或dbWriteTable。
示例代码
library(duckdb) library(DBI) library(dplyr) library(dbplyr) path_data_csv = "data.csv" con <- DBI::dbConnect(duckdb()) data = duckdb::tbl_file(con, path_data_csv) # 构建lazy查询,不调用collect() filtered_data = data |> filter(datasetKey == '12345678', kingdom %in% c('Animalia')) # 直接导出lazy查询结果到CSV duckdb_write_csv(con, filtered_data, "newdata.csv") # 关闭连接 DBI::dbDisconnect(con, shutdown = TRUE)
说明
duckdb_write_csv()会直接让DuckDB执行过滤查询,并将结果写入指定的CSV文件,全程数据不会被加载到R的内存中,完全满足你“无需物化”的需求。- 该方法避开了
collect()、dbExecute和dbWriteTable,符合你的限制条件。
如果需要自定义CSV导出规则(比如分隔符、表头、空值处理等),可以通过函数的额外参数设置:
duckdb_write_csv(con, filtered_data, "newdata.csv", sep = "|", header = TRUE, na = "")
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

