Apache spark 如何使用(Py)Spark对数据集中数据点之间的距离求和?
我有一个时间段内用户的Lat/Lon格式的位置数据集。我想计算一下这些用户旅行的距离。样本数据集: |时间戳|用户|纬度|经度| |146238468 | 49B4361512443A4DA…| 39.777982 |-7.054599| |146238512 | 49B4361512443A4DA…| 39.777982 |-7.054599| |14628389 | 49B4361512443A4DA…| 39.777982 |-7.054599| |146238497 | 49B4361512443A4DA…| 39.777982 |-7.054599| |1465975885 | 6E9E0581E2A032FD8…| 37.118362 |-8.205041| |1457723815 | 405C238E25FE0B9E7…| 37.177322 |-7.426781| |1457897289 | 405C238E25FE0B9E7…| 37.177922 |-7.447443| |1457899229 | 405C238E25FE0B9E7…| 37.177922 |-7.447443| |1457972626 | 405C238E25FE0B9E7…| 37.18059 |-7.46128| |1458062553 | 405C238E25FE0B9E7…| 37.177322 |-7.426781| |1458241825 | 405C238E25FE0B9E7…| 37.178172 |-7.444512| |1458244457 | 405C238E25FE0B9E7…| 37.178172 |-7.444512| |1458412513 | 405C238E25FE0B9E7…| 37.177322 |-7.426781| |1458412292 | 405C238E25FE0B9E7…| 37.177322 |-7.426781| |1465197963 | 6E9E0581E2A032FD8…| 37.118362 |-8.205041| |1465202192 | 6E9E0581E2A032FD8…| 37.118362 |-8.205041| |1465923817 | 6E9E0581E2A032FD8…| 37.118362 |-8.205041| |1465923766 | 6E9E0581E2A032FD8…| 37.118362 |-8.205041| |1465923748 | 6E9E0581E2A032FD8…| 37.118362 |-8.205041| |1465923922 | 6E9E0581E2A032FD8…| 37.118362 |-8.205041| 我曾想过使用自定义聚合器函数,但似乎Python不支持这种功能。此外,操作需要按特定顺序在相邻点上完成,因此我不知道自定义聚合器是否可以工作 我还研究了Apache spark 如何使用(Py)Spark对数据集中数据点之间的距离求和?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有一个时间段内用户的Lat/Lon格式的位置数据集。我想计算一下这些用户旅行的距离。样本数据集: |时间戳|用户|纬度|经度| |146238468 | 49B4361512443A4DA…| 39.777982 |-7.054599| |146238512 | 49B4361512443A4DA…| 39.777982 |-7.054599| |14628389 | 49B4361512443A4DA…| 39.777982 |-7.054599| |146238497 | 49B43615
reduceByKey
,但距离功能似乎不能满足操作员的要求
有没有办法在Spark中高效地执行此操作?它看起来像是窗口功能的作业。假设我们将距离定义为:
从pyspark.sql.functions导入acos、cos、sin、lit和toRadians
def dist(长x、宽x、长y、宽y):
返回acos(
sin(toRadians(lat_x))*sin(toRadians(lat_y))+
cos(环面(lat_x))*cos(环面(lat_y))*
cos(环面(长x)-环面(长y))
)*照明(6371.0)
您可以将窗口定义为:
从pyspark.sql.window导入窗口
w=Window().partitionBy(“用户”).orderBy(“时间戳”)
并使用lag
计算连续观测之间的距离:
来自pyspark.sql.functions的导入延迟
df.带列(“距离”,距离(
“经度”、“纬度”,
滞后(“经度”,1)。超过(w),滞后(“纬度”,1)。超过(w)
).别名(“dist”))
然后可以执行标准聚合。FTR,距离公式是等矩形距离近似值?我看过哈弗森公式,但这似乎不同。顺便说一句,您在方法声明中复制了参数“long_y”。确实,谢谢。应该是这样的。不,谢谢你,它似乎起作用了。另一个问题,这个距离函数的结果的单位是什么?Kms,对吗?至少R看起来是以Kms为单位的。我注意到当计算相等坐标之间的距离时,距离函数在数值上不是很稳定。例如:纬度=41.239548,经度=-8.685635给出
nan
。当坐标相同时,是否可以向距离函数添加条件分支以返回0,或者最好在数据帧级别筛选这些与下一行坐标相同的行?谢谢。当((F.col(lat_x)==lat_y)和(F.col(long_x)==long_y),F.lit(0.0)),否则…。