我在R中的简单实现方面做得很好,但我不熟悉通过R和并行编程与SQL进行通信(在此之前没有这两件事的经验)。我已经用博客,论坛等提示编写了以下代码。
=Variables!PageCount.Value
此计算在for循环中有效但需要永久(我必须将其应用于LARGE数据集!)。当我运行上面的代码时,我得到以下错误!有人能告诉我为什么会出现错误以及如何解决它!
{:task 1 failed - “找不到函数”dbGetQuery“”
出错
答案 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 = "..."