将BigQuery SQL表导入R时报错:strsplit非字符参数
bigrquery + dplyr: Error in strsplit(name, ".", fixed = TRUE) : non-character argument when calling tbl()
环境信息
- R版本:4.3.0 (2023-04-21 ucrt)
- 相关包版本:DBI 1.1.3, bigrquery 1.4.2, dplyr 2.4.0
问题重现代码
install.packages(c("DBI", "dbplyr", "bigrquery")) library(bigrquery) library(DBI) library(dbplyr) con <- dbConnect( bigrquery::bigquery(), project = "sunny-effort-399008", dataset = "Daily_tables", billing = "My_First_Project" ) dbListTables(con) dbIsValid(con) # METs table met <- as.character("Mets") METs <- tbl(con, "Mets")
报错信息
执行tbl(con, "Mets")时触发以下错误:
Error in strsplit(name, ".", fixed = TRUE) : non-character argument
完整调用栈:
14. strsplit(name, ".", fixed = TRUE) 13. as_bq_table.BigQueryConnection(con, sql) 12. as_bq_table(con, sql) 11. db_query_fields.BigQueryConnection(con, ...) 10. dplyr::db_query_fields(con, ...) 9. eval_bare(expr((!!fun)(con, ...))) 8. dbplyr_fallback(con, "db_query_fields", ...) 7. dbplyr_query_fields(src$con, from) 6. vars %||% dbplyr_query_fields(src$con, from) 5. tbl_sql(c(subclass, "dbi"), src = src, from = from, ...) 4. tbl.src_dbi(dbplyr::src_dbi(src, auto_disconnect = FALSE), from = from, ...) 3. tbl(dbplyr::src_dbi(src, auto_disconnect = FALSE), from = from, ...) 2. tbl.DBIConnection(con, "Mets") 1. tbl(con, "Mets")
已尝试的排查步骤
- 确认BigQuery中目标表名(含大小写)无误
- 通过
dbIsValid(con)验证连接有效(返回TRUE) - 尝试将表名转为显式字符型后传入
tbl() - 确认BigQuery项目中存在目标表且权限正常
- 更换3个不同表名测试,均触发相同报错
解决方案
1. 使用bigrquery原生函数替代dbplyr的tbl()
绕过dbplyr接口,直接用bigrquery内置函数获取数据,避免版本兼容问题:
# 直接下载整张表 bq_tbl <- bq_table(project = "sunny-effort-399008", dataset = "Daily_tables", table = "Mets") METs <- bq_table_download(bq_tbl) # 或通过SQL查询获取数据 query <- "SELECT * FROM `sunny-effort-399008.Daily_tables.Mets`" METs <- bq_project_query("My_First_Project", query) %>% bq_table_download()
2. 降级dbplyr至兼容版本
报错源于dplyr 2.4.0与bigrquery 1.4.2的适配问题,可降级dbplyr到稳定兼容版本:
# 卸载当前版本 remove.packages("dbplyr") # 安装兼容版本(如2.3.4) install.packages("dbplyr", version = "2.3.4")
重启R会话,重新加载包后测试连接。
3. 显式使用src_dbi与in_schema()
尝试用in_schema()明确指定数据集和表名:
src <- src_dbi(con, auto_disconnect = FALSE) METs <- tbl(src, in_schema("Daily_tables", "Mets"))
说明
该错误是因为dplyr 2.4.0更新了db_query_fields接口,而bigrquery 1.4.2尚未完全适配,导致as_bq_table函数接收到非字符型参数,触发strsplit报错。优先推荐方案1(使用bigrquery原生函数),若需保留dbplyr链式操作,可尝试方案2或3。
内容的提问来源于stack exchange,提问作者Goik Dominika
相关产品推荐
相关产品推荐

