Ошибка RcallMethod при записи фрейма данных в базу данных Oracle с использованием параллельного подхода - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь записать свой фрейм данных в базу данных Oracle, используя RJDBC-соединение. Я пытаюсь реализовать параллельный подход с использованием foreach / parLappy. Вот мой код

Sys.setenv(JAVA_HOME='C:/Program Files/Java/jre1.8.0_181') 
library(rJava)
library(RJDBC)
library(DBI)

jdbcDriver =JDBC("oracle.jdbc.OracleDriver",classPath="C:/Program Files/directory/ojdbc6.jar", identifier.quote = "\"") 
jdbcConnection =dbConnect(jdbcDriver, "jdbc:oracle:thin:@//XXXX/YYY", "ZZZ", "TTT")
# connected to DB

После этого шага я получаю некоторые данные из БД. После обработки я хочу записать полученный фрейм данных (brand3.merge.u) в другую таблицу в БД Oracle. Мой код

library(foreach)
library(doParallel)

#setup clusters
cl<-makeCluster(7)
registerDoParallel(cl)

clusterExport(cl, varlist = list("jdbcConnection", "brand3.merge.u"))

foreach(x = 1:length(brand3.merge.u$CELL_PH_NUM), .packages=c( "rJava", "RJDBC", "DBI", "data.table"), .combine = 'c') %dopar% {
  rJava::.jinit()
  RJDBC::dbSendUpdate(jdbcConnection, "INSERT INTO xxnvdw.an_cust_analytics  VALUES(?,?,?,?,?,?,?,?)", brand3.merge.u[x, 1], brand3.merge.u[x,2], brand3.merge.u[x,3],brand3.merge.u[x,4],brand3.merge.u[x,5],brand3.merge.u[x,6],brand3.merge.u[x,7],brand3.merge.u[x,8])
}

Я использую rJava::.jinit(), чтобы избежать ошибки JVM. Но теперь я получаю

Error in { : 
  task 1 failed - "RcallMethod: attempt to call a method of a NULL object."

ошибка. Как я могу избежать этой ошибки? Когда я использую функцию print и печатаю свой фрейм данных внутри foreach, я могу получить результат, но функция dbSendUpdate выдает ошибку. Как я могу исправить свою часть "делать вещи" цикла foreach?

ПРИМЕЧАНИЕ: Я уже видел подобный вопрос Ошибка в {: задача 3 не выполнена - "RcallMethod: попытка вызвать метод объекта NULL." но в этом вопросе Часть "делать вещи" в foreach не указана, и я уже использовал функцию clusterExport. Так что мой вопрос не является дублированным вопросом.

РЕШЕНИЕ : Благодаря @HenrikB и @F. Приве я решил проблему. Для тех, кто сталкивается с той же проблемой, мое решение:

foreach(x = 1:iters,  .packages=c( "rJava", "RJDBC", "DBI"), .combine = 'c') %dopar% {
  rJava::.jinit()
  jdbcDriver =JDBC("oracle.jdbc.OracleDriver",classPath="C:/Program Files/directory/ojdbc6.jar", identifier.quote = "\"") # IDENTIFIER.QUOTE!!!!!
  jdbcConnection =dbConnect(jdbcDriver, "jdbc:oracle:thin:@//XXXX/YYY", "ZZZ", "TTT")
  RJDBC::dbSendUpdate(jdbcConnection, "INSERT INTO xxnvdw.an_cust_analytics  VALUES(?,?,?,?,?,?,?,?)", brand3.merge.u[x, 1], brand3.merge.u[x,2], brand3.merge.u[x,3],brand3.merge.u[x,4],brand3.merge.u[x,5],brand3.merge.u[x,6],brand3.merge.u[x,7],brand3.merge.u[x,8])
  dbDisconnect(jdbcConnection)
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...