mysql - { : task 1 failed - "could not find function "dbGetQuery""中的 FOREACH 循环错误

标签 mysql r foreach doparallel

我在 R 中的简单实现方面有很好的实践,但是我不熟悉通过 R 与 SQL 通信以及并行编程(在今天之前没有这两件事的经验)。我根据博客、论坛等的提示编写了以下代码。

library(doParallel) 

library(RMySQL) 

library(DBI)

library(foreach)

cl <- makeCluster(12)

registerDoParallel(cl)

Postcodecsv <- read.csv("C:/Users/Henry Crosby/Desktop/PostcodeLatLong.csv")

mydb = dbConnect(MySQL(), user='****', password="******* ****", 

dbname='population_distance', host='****.**.*.*')

dbListFields(mydb,'Postcodes')

foreach (a = 1:120000, .combine="rbind") %dopar% {

  Done <- dbGetQuery(mydb, paste("select FID, Postcode2, (6371 * acos( cos( 
radians( ",Postcodecsv[a,6],"))*cos(radians(latitude))*cos(radians(Longitude)-radians(",Postcodecsv[a,5],"))+sin(radians(",Postcodecsv[a,6],") )* sin( radians( latitude ) ) ) ) AS distance from Postcodes having distance < 2 ORDER BY distance",sep=" "))

write.table(Done,file="C:/Users/Henry Crosby/Desktop/2km.csv",append=TRUE, col.names=FALSE, sep=",")

  } 

此计算在 for 循环中进行,但需要很长时间(我必须将其应用于大型数据集!)。当我运行上面的代码时,出现以下错误!谁能告诉我为什么会出现错误以及我该如何解决它!

Error in { : task 1 failed - "could not find function "dbGetQuery""

最佳答案

问题是 foreach 正在自动导出 mydb 对象,但它无法正常工作,因为包含套接字连接的对象无法在进程之间序列化和复制。

我建议您使用 clusterEvalQ 函数初始化集群 worker,以便在每个 worker 上创建 mydb。你可以尝试这样的事情:

clusterEvalQ(cl, {
  library(RMySQL)
  mydb <- dbConnect(MySQL(), user='****', password="******* ****",
                    dbname='population_distance', host='****.**.*.*')
  NULL
})

但是,您仍然需要使用 foreach .noexport="mydb" 选项来阻止 foreach 自动导出 mydb。您还可以使用 foreach .verbose=TRUE 选项来验证哪些对象被自动导出给工作人员。

关于mysql - { : task 1 failed - "could not find function "dbGetQuery""中的 FOREACH 循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34633039/

相关文章:

java - 软件首次运行时如何从java代码创建MySQL程序(设置数据库程序))

php - 如何将此查询转换为 SQL SERVER

r - 如何使用 tidyverse 堆叠多列

c# - foreach 对变量的使用是否在 C# 5 中发生了变化?

mysql - 正确排序 MySQL 结果(可能需要子查询)

PHP - 将数据库 ID 附加到变量

r - 在 R 中按顺序查找起始索引和终止索引

r - 具有各种 IF 的矢量,加法和减法

c++ - 并行 for_each 比 std::for_each 慢两倍以上

c# - 设置 FOREACH 中项目的顺序