我正在尝试将数据框插入到oracle表中,如下所示:
我的数据框如下所示:
DAT
DATE LPAR smt lcpu mem psize ent PercentUsr PercentSys PercentWait
3 2013-05-06 00:02:00 server1 4 96 393216 64 16 25.3 8.9 8.1
4 2013-05-06 00:02:30 server1 4 96 393216 64 16 23.2 8.3 7.8
5 2013-05-06 00:03:00 server1 4 96 393216 64 16 21.5 8.8 9.1
6 2013-05-06 00:03:30 server1 4 96 393216 64 16 23.2 8.8 8.2
7 2013-05-06 00:04:00 server1 4 96 393216 64 16 22.1 8.7 7.5
8 2013-05-06 00:04:30 server1 4 96 393216 64 16 21.9 9.8 8.4
PercentIdle Physc PercentEntc Lbusy App Vcsw Phint
3 57.8 6.36 39.7 21.5 39.67 19650 1636
4 60.7 5.81 36.3 21.1 39.85 16636 1436
5 60.6 5.68 35.5 20.6 40.35 16291 1349
6 59.8 6.02 37.6 21.2 37.92 20199 1495
7 61.7 5.78 36.1 20.0 40.08 18721 1499
8 60.0 6.00 37.5 20.5 40.59 19810 1443
\ n
library(RCurl)
library(RODBC)
library(snow)
library(doSNOW)
library(foreach)
if(nrow(dat)>1) {
tryCatch({
ch=odbcConnect("<id>",pwd = "<passwd>")
sqlSave(ch,dat, tablename="TEST", rownames=FALSE, append=TRUE)
},error = function(e) {
print("unable to insert the whole data frame, will try by line, next")
ch=odbcConnect("<id>",pwd = "<passwd>")
foreach(k=1:nrow(dat)) %dopar% {
print(dat[k,])
tryCatch({
sqlSave(ch,dat[k,], tablename="TEST", rownames=FALSE, append=TRUE)
},error=function(e) {
print("unable to insert, duplicate record")
print(e)
})
}
odbcClose(ch)
})
odbcClose(ch)
}
看起来这部分代码没有被执行,任何想法我可能会在这里遗漏:
},error = function(e) {
print("unable to insert the whole data frame, will try by line, next")
ch=odbcConnect("<id>",pwd = "<passwd>")
foreach(k=1:nrow(dat)) %dopar% {
print(dat[k,])
tryCatch({
sqlSave(ch,dat[k,], tablename="TEST", rownames=FALSE, append=TRUE)
},error=function(e) {
print("unable to insert, duplicate record")
print(e)
})
}
odbcClose(ch)
答案 0 :(得分:1)
使用foreach
执行此doSNOW
循环时,数据库连接对象ch
将自动导出到集群工作者,但生成的对象几乎肯定无法正常工作。像文件连接这样的对象无法序列化并发送到其他进程并正常工作。
您可以尝试在执行foreach
循环之前在每个worker上创建数据库连接,并使用.noexport='ch'
来阻止它自动导出,但我同意@joran所做的评论它不值得。