2016-11-29 2 views
0

У меня есть dataframe, похожий наВычислить центроид набора координат на dataframe PySpark

+----+-----+-------+------+------+------+ 
| cod| name|sum_vol| date| lat| lon| 
+----+-----+-------+------+------+------+ 
|aggc|23124|  37|201610|-15.42|-32.11| 
|aggc|23124|  19|201611|-15.42|-32.11| 
| abc| 231|  22|201610|-26.42|-43.11| 
| abc| 231|  22|201611|-26.42|-43.11| 
| ttx| 231|  10|201610|-22.42|-46.11| 
| ttx| 231|  10|201611|-22.42|-46.11| 
| tty| 231|  25|201610|-25.42|-42.11| 
| tty| 231|  45|201611|-25.42|-42.11| 
|xptx| 124|  62|201611|-26.43|-43.21| 
|xptx| 124| 260|201610|-26.43|-43.21| 
|xptx|23124|  50|201610|-26.43|-43.21| 
|xptx|23124|  50|201611|-26.43|-43.21| 
+----+-----+-------+------+------+------+ 

Где для каждого имени у меня есть несколько различных Lat Lon на том же dataframe. Я хотел бы использовать функцию shapely для расчета центроида для каждого пользователя:

Point(lat, lon).centroid() 

Этот UDF смог бы вычислить его:

from shapely.geometry import MultiPoint 
def f(x): 
    return list(MultiPoint(tuple(x.values)).centroid.coords[0]) 

get_centroid = udf(lambda x: f(x), DoubleType()) 

Но как я могу применить его к списку координат каждого пользователя? Кажется, что UDAF в группе не является жизнеспособным решением в этом случае.

ответ

1

Вы хотите:

  • Выполнение функции
  • третья сторона обычная Python, которая не ассоциативно или коммутативной

Единственный выбор у вас есть:

  • группы записей (вы можете использовать RDD.groupBy или collect_list).
  • примените функцию.
  • flatMap (RDD) или соединение (DF).
Смежные вопросы