繁体   English   中英

在R中并行化SQL查询

[英]Parallelizing SQL queries in R

我有六个SQL查询,我通过R编写脚本,每个查询需要很长时间(每个约30分钟)。 一旦每个查询返回I,然后操纵一些标准报告的数据。

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

我在带有Oracle DB的Windows机器上。 我正在关注一篇博客文章 ,使用doSNOW和foreach尝试拆分这些请求,这是我在stackoverflow上可以找到的最好的东西。

我已经能够让这个过程适用于foreach的非并行%do%版本而不是%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,paste('SELECT * FROM ',databases[i]))   
outputPar[i] = result
}
) 

outputPar

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

当您在串行foreach循环中进行赋值outputPar[i] = result ,这是正常的(但实际上并不是foreach的预期用途)。 在并行循环中进行此分配时,它不正常。 请参阅http://tolstoy.newcastle.edu.au/R/e10/help/10/04/3237.html ,查看David Smith在Revolution发表的类似问题。

作为解决方案,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM