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

计算PySpark数据帧上一组坐标的质心,pyspark,geospatial,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.4

我有一个类似于

+----+-----+-------+------+------+------+
| 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())
但是如何将其应用于每个用户的坐标列表?在这种情况下,似乎group by上的a不是一个可行的解决方案。

您想要:

  • 执行第三方纯Python函数
  • 它不是结合的或交换的
您唯一的选择是:

  • 分组记录(您可以使用
    RDD.groupBy
    collect\u list
  • 应用该函数
  • 平面映射(RDD)或连接(DF)

尝试根据事件发生的地理位置对事件进行类似的分组,您是否能够找到解决方案?谢谢