我有这组数据:
[('Manhattan', ('East Village', 2)),
('Manhattan', ('Theater District', 2)),
('Queens', ('Sunnyside', 2)),
('Manhattan', ('Murray Hill', 2)),
('Manhattan', ('Battery Park City', 2)),
('Queens', ('John F. Kennedy International Airport', 2)),
('Queens', ('LaGuardia Airport', 2)),
('Manhattan', ('NoHo', 2)),
('Manhattan', ('Chinatown', 2)),
('Brooklyn', ('Brooklyn Heights', 2))]
我的目标是,对于每一个行政区,我希望在总和方面排名前三
此数据的格式为
X = (Borough, (Neighborhood, total))
我的思考过程是:
我想对这些数据做一个groupbykey,首先得到所有三个行政区,然后是三个最高的社区,因此代码:
X.groupByKey().mapValues(sum).collect()
但是,据我所知,这将给出一个错误,因为第二个元素也是一个元组,我想访问第二个元组的第二个元素,我不知道如何访问
同样,通过这种方式,我只需要聚合数据,因此我编写了这段代码,它将为我提供三个最高的邻域:
def findingLargest(item):
from heapq import nlargest
i, j = item
tops = nlargest(3, j,key=lambda x: x[1])
return (i, tops)
所以,我能想到的最后一个代码是:
X.groupByKey()\
.map(findingLargest)
预期产出:
Borough, Top_1 Neighborhood, Top_1_count, Top_2 Neighborhood, Top_2_count
关于如何进行这项工作,有什么建议吗
我有一个解决方案,但它需要每次从
rdd
切换到使用DataFrame
。最直接的实现是直接使用DataFrame
将rdd转换为(键1\u键2,值)格式:
然后汇总:
拆分以获取(键1、键2、值)格式:
使用
DataFrame
API选择前n个特性会更容易(事实上,第一部分会更容易)。我使用window
函数:要获得所需的输出,一种方法是切换回
rdd
:相关问题 更多 >
编程相关推荐