使用 SparkR 计算地理距离
Posted
技术标签:
【中文标题】使用 SparkR 计算地理距离【英文标题】:Geo distance calculation using SparkR 【发布时间】:2017-08-03 12:19:47 【问题描述】:我在 R 中有一个 Spark 数据框,如下所示
head(df)
Lat1 Lng1 Lat2 Lng2
23.123 24.234 25.345 26.456
... ... ... ...
DataFrame
包含两个点纬度和经度
我想计算每行中节点之间的地理距离并将其添加到新列中。
在 R 中,我使用来自 geosphere
库的 distCosine
函数。
df$dist = distCosine(cbind(df$lng1,df$lat1),cbind(df$lng2,df$lat2))
我想知道我应该如何在 SparkR 中计算它。
SparkR 产生以下错误,
Error in as.integer(length(x) > 0L) :
cannot coerce type 'S4' to vector of type 'integer'
【问题讨论】:
【参考方案1】:您不能直接在 Spark DataFrames
上使用标准 R 函数。如果您使用最近的 Spark 版本,您可以使用 dapply
,但它有点冗长和缓慢:
df <- createDataFrame(data.frame(
lat1=c(23.123), lng1=c(24.234), lat2=c(25.345), lng2=c(26.456)))
new_schema <- do.call(
structType, c(schema(df)$fields(), list(structField("dist", "double", TRUE))))
attach_dist <- function(df)
df$dist <- geosphere::distCosine(
cbind(df$lng1, df$lat1), cbind(df$lng2, df$lat2))
df
dapply(df, attach_dist, new_schema) %>% head()
lat1 lng1 lat2 lng2 dist
1 23.123 24.234 25.345 26.456 334733.4
在实践中,我宁愿直接使用公式。它会更快,所有需要的功能都已经可用并且不是很复杂:
df %>% withColumn("dist", acos(
sin(toRadians(df$lat1)) * sin(toRadians(df$lat2)) +
cos(toRadians(df$lat1)) * cos(toRadians(df$lat2)) *
cos(toRadians(df$lng1) - toRadians(df$lng2))
) * 6378137) %>% head()
lat1 lng1 lat2 lng2 dist
1 23.123 24.234 25.345 26.456 334733.4
【讨论】:
以上是关于使用 SparkR 计算地理距离的主要内容,如果未能解决你的问题,请参考以下文章