FOREACH LOOP {:task 1 failed - “找不到函数”dbGetQuery“”错误

时间:2016-01-06 12:20:41

标签: mysql r foreach doparallel

我在R中的简单实现方面做得很好,但我不熟悉通过R和并行编程与SQL进行通信(在此之前没有这两件事的经验)。我已经用博客,论坛等提示编写了以下代码。

=Variables!PageCount.Value

此计算在for循环中有效但需要永久(我必须将其应用于LARGE数据集!)。当我运行上面的代码时,我得到以下错误!有人能告诉我为什么会出现错误以及如何解决它!

  

{:task 1 failed - “找不到函数”dbGetQuery“”

出错

2 个答案:

答案 0 :(得分:0)

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

我建议您使用clusterEvalQ函数初始化集群工作者,以便为每个工作人员创建mydb。你可以尝试类似的东西:

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

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

答案 1 :(得分:0)

为什么使用R来处理sql到csv的迁移?考虑一个完整的SQL解决方案并在数据库引擎上保留处理。具体来说,加入Postcodes表和PostcodeLatLong csv数据(当然,导入MySQL数据库)。然后使用MySQL的OUTFILE工具。总而言之,您只需运行dbGetQuery()一次而无需并行循环:

expotCSV <- dbGetQuery("SELECT FID, Postcode2, (6371 * acos( cos( 
                     radians(Postcodecsv.col6))*cos(radians(latitude))*cos(radians(Longitude)-
                     radians(Postcodecsv.col5))+sin(radians(Postcodecsv.col6))* sin(radians(latitude)))) 
                     AS distance     

              FROM Postcodes 
              INNER JOIN PostcodeLatLong ON csv.joinfield = PostcodeLatLong.joinfield
              HAVING distance < 2 
              ORDER BY distance

              INTO OUTFILE 'C:/Users/Henry Crosby/Desktop/2km.csv' 
              FIELDS ENCLOSED BY '\"' 
              TERMINATED BY ';' 
              ESCAPED BY '\"' 
              LINES TERMINATED BY '\\r\\n';")

挑战在于找到joinfield或两个表之间的关系。但是,SQL还允许cartesian product or the cross join(对于看似无关的表),其中查询返回列出的表之间的总组合集。您可以通过一些过滤子句使用where子句:

FROM Postcodes, PostcodeLatLong 
WHERE Postcodes.somefactor = "..." AND PostcodeLatLong.somefactor = "..."

或者,MySQL的CROSS JOIN(没有ON子句的JOIN)

FROM Postcodes CROSS JOIN PostcodeLatLong 
WHERE Postcodes.somefactor = "..." AND PostcodeLatLong.somefactor = "..."