如何快速将数据从R导出到SQL Server

时间:2013-10-04 21:03:30

标签: sql sql-server r bigdata

标准RODBC软件包的sqlSave函数即使作为单个INSERT语句(参数fast = TRUE),由于非最小负载,对于大量数据来说非常慢。如何以最少的日志记录将数据写入我的SQL服务器,以便更快地写入?

目前正在尝试:

toSQL = data.frame(...);
sqlSave(channel,toSQL,tablename="Table1",rownames=FALSE,colnames=FALSE,safer=FALSE,fast=TRUE);

2 个答案:

答案 0 :(得分:31)

通过在本地将数据写入CSV然后使用BULK INSERT(不像sqlSave那样的预建功能可用),可以非常快速地将数据写入MS SQL Server。

toSQL = data.frame(...);
write.table(toSQL,"C:\\export\\filename.txt",quote=FALSE,sep=",",row.names=FALSE,col.names=FALSE,append=FALSE);
    sqlQuery(channel,"BULK
                INSERT Yada.dbo.yada
                FROM '\\\\<server-that-SQL-server-can-see>\\export\\filename.txt'
                WITH
                (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\\n'
                )");

SQL Server必须具有访问包含CSV文件的网络文件夹的权限,否则此过程将无效。虽然它需要一些具有各种权限的设置(网络文件夹和BULK ADMIN权限,但速度的奖励无限更有价值。)

答案 1 :(得分:0)

我完全同意BULK INSERT非小型的任何数据的正确选项。 但是,如果您需要添加2-3行,例如调试消息它BULK INSERT似乎有点矫枉过正。

您的问题的答案是DBI::dbWriteTable()函数。下面的示例(我将我的R代码连接到AWS RDS的{​​{1}}实例):

MS SQL Express

对于传输的少量数据,它的工作速度非常快,如果你想要library(DBI) library(RJDBC) library(tidyverse) # Specify where you driver lives drv <- JDBC( "com.microsoft.sqlserver.jdbc.SQLServerDriver", "c:/R/SQL/sqljdbc42.jar") # Connect to AWS RDS instance conn <- drv %>% dbConnect( host = "jdbc:sqlserver://xxx.ccgqenhjdi18.ap-southeast-2.rds.amazonaws.com", user = "xxx", password = "********", port = 1433, dbname= "qlik") if(0) { # check what the conn object has access to queryResults <- conn %>% dbGetQuery("select * from information_schema.tables") } # Create test data example_data <- data.frame(animal=c("dog", "cat", "sea cucumber", "sea urchin"), feel=c("furry", "furry", "squishy", "spiny"), weight=c(45, 8, 1.1, 0.8)) # Works in 20ms in my case system.time( conn %>% dbWriteTable( "qlik.export.test", example_data ) ) # Let us see if we see the exported results conn %>% dbGetQuery("select * FROM qlik.export.test") # Let's clean the mess and force-close connection at the end of the process conn %>% dbDisconnect() - &gt;,它看起来相当优雅。 data.frame解决方案。

享受!