【问题标题】:Geo distance calculation using SparkR使用 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'

【问题讨论】:

    标签: r apache-spark distance geo


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多