计算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)