У меня есть розничный набор данных в фрейме данных pyspark.sql со многими магазинами, и для каждого магазина у меня есть долгота и широта, я пытаюсь сделать две вещи:
- найти ближайший 5 магазинСоседи каждого хранилища (в формате dict или в любом другом)
- создают столбцы как расстояние хранилища с фиксированной точкой (заглавные буквы для примера)
кадр данных выглядит как
|x_latitude|y_longitude|id_store|
+----------+-----------+--------+
| 45.116099| 7.712317| 355|
| 45.116099| 7.712317| 355|
| 45.116099| 7.712317| 355|
| 45.116099| 7.712317| 355|
Я пытался приспособить функцию haversine python к pyspark с помощью udf, но я застрял с методологией, как это сделать
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(F.radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = F.sin(dlat/2)**2 + F.cos(lat1) * F.cos(lat2) * F.sin(dlon/2)**2
c = 2 * F.atan2( F.sqrt(a), F.sqrt(1-a))
r = 6371 # Radius of earth in kilometers
return c * r
@udf('double')
def closest(v):
return F.min(lambda p: haversine(v['lat'],v['lon'], p['lat'],p['lon']))
но у меня есть только долгота / долгота магазина широта / долгота2будет (я думаю) широта / долгота другого магазина, но я не знаю, как перебрать данные в кадре, чтобы вычислить расстояние от фиксированного хранилища с остальными.