对PySpark groupby应用不同的聚合函数
我有一个数据帧,其结构类似于对PySpark groupby应用不同的聚合函数,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|20161
+----+-----+-------+------+------+------+
| 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
值,但使用我自己的函数:
def get_centroid(lat, lon):
# ...do whatever I need here
return t_lat, t_lon
get_c = udf(lambda x, y: get_centroid(x,y), FloatType())
gg = df.groupby('cod', 'name').agg(get_c('lat', 'lon'))
但我得到了以下错误:
u"expression 'pythonUDF' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.;"
有没有一种方法可以在不使用UDAF的情况下获取组元素并对其进行操作?类似于熊猫的东西
df.groupby(['cod','name'])[['lat', 'lon']].apply(f).to_frame().reset_index()
因此,让我们假设我不打算做UDAF。还有别的办法吗?现在我发现的最好的方法是转换成熊猫数据帧并在那里工作……所以我不打算做UDAF。还有别的办法吗?现在我发现最好的方法是转换成熊猫数据帧并在那里工作。。。