在R的Arrow工作流中能否通过DuckDB执行直接SQL查询?
在R的Arrow工作流中用DuckDB执行原生SQL查询
完全可以实现,你的思路没问题——当部分dplyr动词无法在Arrow/DuckDB后端正确转换时,直接用原生SQL确实是可靠的解决方案。不过你示例里的SQL_QUERY函数并不存在,下面是两种正确的实现方式:
方法1:在dplyr工作流中嵌入原生SQL
利用dplyr::sql()函数包裹原生SQL语句,配合tbl()可以无缝衔接Arrow到DuckDB的工作流:
library(duckdb) library(arrow) library(dplyr) # 按分区打开Arrow数据集 ds <- arrow::open_dataset("nyc-taxi", partitioning = c("year", "month")) # 转换到DuckDB并执行原生SQL查询 ds %>% to_duckdb() %>% tbl(sql("SELECT * LIMIT 100")) %>% collect()
方法2:直接操作DuckDB连接执行SQL
如果需要更灵活的SQL执行,可以提取DuckDB连接后用dbGetQuery()直接执行:
library(duckdb) library(arrow) library(dplyr) ds <- arrow::open_dataset("nyc-taxi", partitioning = c("year", "month")) # 将Arrow数据集导入DuckDB临时表,指定表名方便后续SQL调用 duck_tbl <- ds %>% to_duckdb(name = "nyc_taxi") # 提取DuckDB连接对象 conn <- duck_tbl$src$con # 直接执行原生SQL result <- dbGetQuery(conn, "SELECT * FROM nyc_taxi LIMIT 100")
关键说明
to_duckdb()会把Arrow数据集转换为DuckDB中的临时表,默认会生成随机表名,建议通过name参数指定固定名称,方便SQL引用。- 两种方式都能保留Arrow的高效数据读取能力,同时借助DuckDB的SQL引擎执行复杂逻辑,完美解决dplyr转换失效的问题。
内容的提问来源于stack exchange,提问作者Matthew Son
相关产品推荐
相关产品推荐

