Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何使用(Py)Spark对数据集中数据点之间的距离求和?_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Apache spark 如何使用(Py)Spark对数据集中数据点之间的距离求和?

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

我有一个时间段内用户的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不支持这种功能。此外,操作需要按特定顺序在相邻点上完成,因此我不知道自定义聚合器是否可以工作

我还研究了
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)),否则…。