在R中并行化SQL查询

前端之家收集整理的这篇文章主要介绍了在R中并行化SQL查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有六个SQL查询,我脚本虽然R,每个花费很长时间(每个约30分钟).一旦每个查询返回我,然后操作一些标准报告的数据.

我想做的是使用我的多核机器从R并行运行这些sql请求

我在一台带有Oracle DB的Windows机器上.我正在跟着一个blog post使用doSNOW和foreach来尝试分割这些请求,这是我在stackoverflow上找到的最好的东西.

我已经能够使进程适用于非并行的%do%版本的foreach,但不是%dopar%.使用%dopar%它只返回一个空集.以下是设置表并运行查询代码,以便您可以看到会发生什么.如果有太多的基本代码,请提前道歉.

我看了一些其他的R包,但没有看到一个明显的解决方案.另外,如果你有一个更好的方法来管理这种过程,我有兴趣听到它 – 只要记住,我是分析师,而不是一个计算机科学家.谢谢!

#Creating a cluster
library(doSNOW)
cl <- makeCluster(c("localhost","localhost"),type = "SOCK")
registerDoSNOW(cl)

#Connecting to database through RODBC
ch=odbcConnect("",pwd = "xxxxx",believeNRows=FALSE)
#Test connection
odbcGetInfo(ch)

#Creating database tables for example purposes
qryA1 <- "create table temptable(test int)" 
qryA2 <- "insert into temptable(test) values((1))" 
qryA3 <- "select * from temptable" 
qryA4 <- "drop table temptable" 
qryB1 <- "create table temptable2(test int)" 
qryB2 <- "insert into temptable2(test) values((2))" 
qryB3 <- "select * from temptable2" 
qryB4 <- "drop table temptable2"  

sqlQuery(ch,qryA1) 
sqlQuery(ch,qryA2) 
doesItWork <- sqlQuery(ch,qryA3) 
doesItWork
sqlQuery(ch,qryB1) 
sqlQuery(ch,qryB2) 
doesItWork <- sqlQuery(ch,qryB3) 
doesItWork

result = c()
output = c()
databases <- list('temptable','temptable2')


#Non-parallel version of foreach
system.time(
foreach(i = 1:2)%do%{
result<-sqlQuery(ch,paste('SELECT * FROM ',databases[i]))   
output[i] = result
}
) 

output

#Parallel version of foreach

outputPar = c()

system.time(
foreach(i = 1:2)%dopar%{
#Connecting to database through RODBC
ch=odbcConnect(dsn,pwd = "xxxxxx",believeNRows=FALSE)
#Test connection
odbcGetInfo(ch)
result<-sqlQuery(ch,databases[i]))   
outputPar[i] = result
}
) 

outputPar

sqlQuery(ch,qryA4)
sqlQuery(ch,qryB4)

解决方法

当您将分配outputPar [i] =结果放在串行foreach循环中时,这是可以的(但不是真正使用foreach).当您在并行循环中进行此分配时,它不行.见大卫·史密斯在革命中回答的类似问题,见 http://tolstoy.newcastle.edu.au/R/e10/help/10/04/3237.html.

作为解决方案,

system.time(
  outputPar <- foreach(i = 1:2,.packages="RODBC")%dopar%{
#Connecting to database through RODBC
  ch=odbcConnect(dsn,believeNRows=FALSE)
#Test connection
  odbcGetInfo(ch)
  result<-sqlQuery(ch,databases[i]))   
  result
}
)

猜你在找的MsSQL相关文章