计算PySpark数据帧上一组坐标的质心

时间:2016-11-29 11:28:19

标签: pyspark geospatial

我的数据框类似于

+----+-----+-------+------+------+------+
| 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。我想使用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 个答案:

答案 0 :(得分:1)

你想:

  • 执行第三方普通Python功能
  • 哪个不是关联的或可交换的

您唯一的选择是:

  • 群组记录(您可以使用RDD.groupBycollect_list)。
  • 应用该功能。
  • flatMap(RDD)或join(DF)。