Я пытаюсь записать свой фрейм данных в базу данных 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)
}