Pyspark Haversine Расстояние - PullRequest
       4

Pyspark Haversine Расстояние

0 голосов
/ 12 октября 2018

У меня есть розничный набор данных в фрейме данных 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будет (я думаю) широта / долгота другого магазина, но я не знаю, как перебрать данные в кадре, чтобы вычислить расстояние от фиксированного хранилища с остальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...