我正在尝试使用RJDBC连接将数据帧写入Oracle DB。我正在尝试使用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 DB中的另一个表。我的代码是
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."
错误。如何避免此错误?当我使用打印功能并在foreach中打印我的数据框时,我可以得到结果,但是dbSendUpdate函数会产生错误。如何修复foreach循环中的“东西”部分?
注意:我已经看到了类似的问题Error in { : task 3 failed - "RcallMethod: attempt to call a method of a NULL object.",但是在此问题中,未给出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)
}