R:从SQL Server并行导入数据不会返回数据

时间:2019-04-09 09:46:57

标签: r sql-server parallel-processing

我必须导入8年的月度数据,其中每个月都包含cca。 360.000个观测值,每个观测值都有75个变量。数据存储在SQL Server中。

我尝试通过此代码逐年导入,但未创建最终数据框。此外,r应该在所有年份中保持条件,但是每个值都相同。

这是我的代码:

library(foreach)
library(doParallel)

numCores <- detectCores()

system.time({
  nr_years <- 8
  start_year <-  2010
  registerDoParallel(numCores)

  steps <- foreach::foreach(icount(nr_years), .combine = rbind) %dopar% {
    next_year <- start_year +1 
    date_before <- paste0(start_year, '-12-31', sep = '')
    date_end <- paste0(next_year, '-12-31', sep = '')

    myQuery <- RxSqlServerData(sqlQuery = sprintf("SELECT DATE,CLIENT_NO,MAT_ST
                           FROM DBO.DATA_TABLE 
                           WHERE DATE >='%s' and DATE <= '%s'", date_before, date_end), connectionString = connStr, returnDataFrame = TRUE)

    my_df <- rxImport(myQuery)
    #start_year <- start_year + 1 

  }
})

我通过将%dopar%替换为%do%来测试代码:数据帧未合并,但被重写(对象steps是正确的)。

但是,我希望并行导入数据,并在年底将所有年份都绑定在数据帧my_df中。

注意

我发现,对于%dopar%foreach函数的最后一行的结果将保存到steps(因此,我已经注释了最后一行)。但是,数据仍然不是rbinded,而仅包含第一次迭代的结果。

1 个答案:

答案 0 :(得分:0)

在并行处理中,将生成部分结果并将其“保存”到不同的对象,并且仅在最后合并时才保存。因此,问题在于将数据保存到对象。

我找到了一种适用于较少数量变量的解决方案

period <- function(it){
  res <- c(paste0(start_year + it, '-12-31', sep = ''), paste0(start_year + 1 + it, '-12-31', sep = ''))

}

system.time({
  numCores <- detectCores()
  start_year <-  2016
  registerDoParallel(numCores)

  raz2 <- foreach(i=0:3, .combine = rbind, .multicombine = TRUE) %dopar% {
    dates <- period(i)
    myQuery <- RxSqlServerData(sqlQuery = sprintf("SELECT DATE,CLIENT_NO,MAT_ST
                           FROM DBO.DATA_TABLE 
                           WHERE DATE >='%s' and DATE <= '%s'", dates[[1]], dates[[2]]), connectionString = connStr, returnDataFrame = FALSE)
    rxImport(myQuery)
  }
})

但是,如果要导入75个变量,则会出现错误:

  

{中的错误:任务2失败-“分配错误”,计时在以下位置停止:34.97   7.33 392.9