sql - 将整个 SQL Server 表导入 R
问题描述
我在 SQL Server 中有一个表,想将整个表导入 R 以执行一些工作。
我正在尝试为此找到最佳路径,因为表大小可能很大(约 6000 万)
SQL Server 中有一个 bcp Utility 命令行实用程序,这是一种选择。
但是有人有其他建议吗?
解决方案
您可以sqlcmd
用于批量查询。它比 Microsoft 的 ODBC 驱动程序(或 FreeTDS)可以做的任何事情都快得多。
如果您的查询是(比如说)
SELECT Id, Field1, Field2 FROM TableName WHERE Field1 = 'QUUX'
然后你的命令行会是这样的:
sqlcmd -S serveraddress -d databasename \
-U username -P '*PASSWORD*' \
-W -s , -o out.csv \
-Q "SET NOCOUNT ON; SELECT Id, Field1, Field2 FROM TableName WHERE Field1 = 'QUUX'"
(如果您的服务器位于非标准端口上,请使用-S serveraddress,portnumber
.)
我倾向于不喜欢 R system
(或者system2
,薄单板),而是更喜欢processx
包,因为它更安全地处理命令行参数。
bgquery <- processx::run("sqlcmd",
args = c("-s", "serveraddress", "-d", "databasename",
"-U", "username", "-P", "*PASSWORD*", "-W", "-s", ",", "-o", "out.csv",
"-Q", "SET NOCOUNT ON; SELECT Id, Field1, Field2 FROM TableName WHERE Field1 = 'QUUX'"),
error_on_status = FALSE, echo_cmd = FALSE, echo = FALSE)
# check its stdout, it can be rather verbose
tail(bgquery$results$stdout)
# check the return value, typically "0" for command success
bgquery$results$status
# if error, look at the error output, something might be in the stdout above, too
bgquery$results$stderr
此时,读入文件:
x <- data.table::fread("out.csv", nrows = 3, na.strings = c("NA", "", "NULL"))
注意:sqlcmd
不引用值。例如,
SELECT 'hello,world' as A
使用sqlcmd
将返回
A
hello,world
这显然是坏的。如果这是一个问题,您可能会被卡住。bcp
是另一种有其自身问题的选择,因此它不是完美的替代品。
推荐阅读
- c - 错误:数字常量 int sem_init(sem_t *s,0,unsigned int val) 之前的预期声明说明符或“...”;
- java - 为什么 java tcp 服务器接受关闭的套接字?
- actions-on-google - 有没有办法使用实体名称而不是实体 ID 来调用 DialogFlow v2 api?
- visual-c++ - 如何在编辑控件 MFC 中获取光标位置?
- google-app-engine - 从 python ndb 客户端读取嵌入式实体
- javascript - HTML/CSS:出现滚动条时获取不同的 offsetWidth 值
- subquery - 选择多个字段不在子查询中的位置(不包括连接)
- presto - Presto 如何收集运行时内存?
- c++ - 我想在终端窗口中运行我的 CLion 程序
- java - Android Studio - Firebase 在尝试签署 facebook 或 google 时返回 null