我正在使用spark 2.3.1。
我正在努力解决以下问题。我有数据作为Pair(Key,Data)。但是由于我需要对数据进行处理的性质,我需要运行地图分区。那是因为我需要在每个分区中实例化一个不可序列化的对象,以执行我需要执行的转换。
出于性能原因,我希望每个分区仅包含特定键的数据。
从某种意义上说,我想要GroupByKey,并映射到那些组上?但是,在组上映射不等于在分区上映射。根据我运行的经验,多个组可以位于同一分区内。
运行以下代码将其显示。
partioneddf.rdd.groupBy(r => r(2).asInstanceOf[Long]).foreachPartition { it => {
while (it.hasNext) {
println(it.next._2.toString)
};
println("\n===\n") }}
这给了我看起来像这样的结果
===
CompactBuffer([美国,古巴,478])CompactBuffer([法国 波利尼西亚,美国,43],[美国,马提尼克岛,43], [乌拉圭,美国,43])CompactBuffer([United 国家,危地马拉,318])CompactBuffer([卢森堡,美国,155])
===
CompactBuffer([Peru,United States,279])CompactBuffer([United 州,奥地利,63],[美国,圭亚那,63]) CompactBuffer([爱尔兰,美国,335]) CompactBuffer([百慕大,美国,183])CompactBuffer([美国 州,墨西哥,7187])
===
===
CompactBuffer([巴拉圭,美国,60]) CompactBuffer([法国,美国,935])CompactBuffer([美国 States,Palau,31])CompactBuffer([United States,Jordan,44], [乔丹,美国,44],[马提尼克岛,美国,44])
===
这完全不是我想要的。我希望每个分区只有一个组,并使用mapPartition在该组上进行映射。
在火花中甚至可行吗?我检查了API,但没有提供方法。也许我认为这个问题是错误的。
请提出任何建议或建议吗?
EDIT1:
对此进行反思,我得出的结论是,如果将每个组中的内容分组,那么很好,但是至少我希望每个分区具有“大组”,而不是将我的组散布到所有分区中我有。
从某种意义上说,我想在一个分区中同时放置一个组中的所有元素。
然后,我可以逐组映射分区处理,考虑到我需要执行的操作的性质,也许可以每组分批处理。
因此,放宽约束,问题就变成了,如何设置火花,以使同一组(即共享同一键)的记录尽可能地位于同一分区中。