Dplyr и RJDBC: не удалось найти унаследованный метод для функции 'dbGetQuery' для подписи '"JDBCConnection", "tbl_df"
Я использую пакет RJDBC для подключения к БД Oracle. Мне нужно получить огромное количество данных, и я хотел бы распределить запрос по различным ядрам. Я знаю, что в таблице пять миллионов записей. Таким образом я пишу SQL-запрос как:
SqlCMD = "SELECT * from ( SELECT m.*, rownum r FROM Table ) WHERE r >= minV AND r < maxV"
points = ceiling(seq(1, rownum, length.out = 20))
[1] 1 269578 539154 808730 1078306 1347882 1617458 1887034 2156610 2426186 2695762 2965338 3234914 3504490 3774066
[16] 4043642 4313218 4582794 4852370 5121946
sqlCl = NULL
for (i in 1:19){
sqlCl[i] = gsub("minV", points[i], sqlCMD)
sqlCl[i] = gsub("maxV", points[i+1], sqlCl[i])
}
sqlCl = sqlCl %>% as.data.frame
group <- rep(1:cl, length.out = 19)
sqlCl <- bind_cols(tibble(group), sqlCl)
cl <- create_cluster(8)
Затем я раздаю по ядрам и устанавливаю ядра env
by_group <- sqlCl %>%
partition(group, cluster = cl)
by_group %>%
cluster_library("RJDBC") %>%
cluster_library("dplyr") %>%
cluster_assign_value("sqlCl", sqlCl) %>%
cluster_assign_value("pathOjdbc", pathOjdbc)%>% #path to ojdbc8.jar
cluster_assign_value("dbName", dbName) %>%
cluster_assign_value("user", user)%>%
cluster_assign_value("password", password) %>%
cluster_assign_value("dbGetQuery", dbGetQuery)
by_group %>%
cluster_assign_value("conn",
dbConnect(JDBC(driverClass="oracle.jdbc.OracleDriver", classPath = pathOjdbc),
dbName, user , password))
Затем я пытаюсь сделать запрос:
ws3_processed_in_parallel <-
by_group %>%
do({
df = RJDBC::dbGetQuery(conn, sqlCl)
})
Я получил эту ошибку, и я действительно не знаю, что я могу сделать.
Error in checkForRemoteErrors(lapply(cl, recvResult)) :
8 nodes produced errors; first error: unable to find an inherited method for function ‘dbGetQuery’ for signature ‘"JDBCConnection", "tbl_df"’
Я пытаюсь также с "TBL", но я получаю это:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘dbBegin’ for signature ‘"JDBCConnection"’
1 ответ
dbGetQuery
ожидает его statement
аргумент, чтобы быть класса character
в то время как вы, кажется, используете все, что у вас есть от cluster_assign_value("sqlCl", sqlCl)
,
Вы также используете cl
в создании group
а также sqlCl
и я не уверен, что sqlCl
выглядит как в конце.
Может быть, вы хотите использовать cluster_assign_each(...
вместо cluster_assign_value("sqlCl", sqlCl)
,
Я также не уверен, почему у вас есть by_group %>% cluster_library(...
и не cl %>% cluster_library(...
,