Mic*_*ael 15 sql-server odbc r fread dataframe
我正在尝试分析存储在 R 和 Mac 上的 SQL 数据库(MS SQL 服务器)中的数据。典型的查询可能会返回几 GB 的数据,而整个数据库只有几 TB。到目前为止,我一直在使用 R 包odbc,它似乎工作得很好。
不过,dbFetch()好像真的很慢。例如,一个有点复杂的查询在大约 6 分钟内在 SQL 服务器中返回所有结果,但如果我运行它odbc然后尝试dbFetch,需要将近一个小时才能将完整的 4 GB 放入 data.frame。我试过分块获取,这有助于适度:https : //stackoverflow.com/a/59220710/8400969。我想知道是否有另一种方法可以更快地将数据通过管道传输到我的 mac,我喜欢这里的思路:快速读取非常大的表作为数据帧
dbFetch当查询的结果是几GB的数据时,有哪些加速的策略?如果问题是data.frame从较大的表生成对象,是否可以通过以不同方式“获取”来节省成本?还有其他可能有帮助的软件包吗?
感谢您的想法和建议!
小智 0
我的答案包括使用不同的包。我使用RODBC在 cran 中找到的https://cran.r-project.org/web/packages/RODBC/index.html。
这为我节省了很多挫败感,并浪费了我以前导出每个查询结果以将.csv其加载到我的R环境中的方法所带来的时间。我发现常规 ODBC 比 RODBC 慢得多。我使用以下函数:
sqlQuery()包装打开与 SQL 数据库连接的函数,其中第一个参数(在括号中)和查询本身作为第二个参数。将查询本身放在引号中。
odbcConnect()本身就是 中的第一个参数sqlquery()。中的参数odbcConnect()是 SQL 数据库连接的名称。将连接名称放在引号中。
odbcCloseAll()是该任务集的最终函数。每次之后使用此命令sqlQuery()可以关闭连接并避免出现烦人的警告消息。
这是一个简单的例子。
library(RODBC)
result <- sqlQuery(odbcConnect("ODBCConnectionName"),
"SELECT *
FROM dbo.table
WHERE Collection_ID = 2498")
odbcCloseAll()
Run Code Online (Sandbox Code Playgroud)
这是相同的示例加上直接从查询结果进行数据操作。
library(dplyr)
library(RODBC)
result <- sqlQuery(odbcConnect("ODBCConnectionName"),
"SELECT *
FROM dbo.table
WHERE Collection_ID = 2498") %>%
mutate(matchid = paste0(schoolID, "-", studentID)) %>%
distinct(matchid, .keep_all - TRUE)
odbcCloseAll()
Run Code Online (Sandbox Code Playgroud)