Dplyr和RJDBC:无法为签名'" JDBCConnection"," tbl_df"找到函数'dbGetQuery'的继承方法。

时间:2018-03-22 14:53:42

标签: r parallel-processing dplyr rjdbc multidplyr

我使用RJDBC包连接到Oracle DB。 我需要检索大量数据,我想通过不同的核心分发查询。 我知道这张桌子有五百万条记录。因此,我编写了一个SQL查询,如:

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))

然后我分发到核心并设置env核心

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"’

我收到了这个错误,我真的不知道我能做些什么。

  Error in (function (classes, fdef, mtable)  : 
      unable to find an inherited method for function ‘dbBegin’ for signature ‘"JDBCConnection"’

我也尝试过&#34; tbl&#34;但我明白了:

RecyclerView

1 个答案:

答案 0 :(得分:0)

dbGetQuery期望其statement参数属于character类,而您似乎正在使用cluster_assign_value("sqlCl", sqlCl)中的所有内容。
您还在创建clgroup时使用sqlCl,我不确定sqlCl到底是什么样的。

也许您想使用cluster_assign_each(...代替cluster_assign_value("sqlCl", sqlCl)

我也不确定你为什么by_group %>% cluster_library(...而不是cl %>% cluster_library(...