我正在使用spark 2.3.1 .

我正在努力解决以下问题 . 我的数据来自Pair(密钥,数据) . 但是由于我需要对数据做的性质,我需要运行一个map分区 . 那是因为我需要在每个分区中实例化一个不可序列化的对象来执行我需要做的转换 .

出于性能原因,我希望每个分区只包含特定键的数据 .

从某种意义上说,我想要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([美国] ,危地马拉,318])CompactBuffer([卢森堡,美国,155])=== CompactBuffer([秘鲁,美国,279])CompactBuffer([美国,奥地利,63],[美国,圭亚那,63] )CompactBuffer([Ireland,United States,335])CompactBuffer([Bermuda,United States,183])CompactBuffer([美国,墨西哥,7187])=== === CompactBuffer([巴拉圭,美国,60] )CompactBuffer([法国,美国,935])CompactBuffer([美国,帕劳,31])CompactBuffer([美国,约旦,44],[约旦,美国,44],[马提尼克岛,美国,44] ])===

这完全不是我想要的 . 我希望每个分区只有一个组,并使用mapPartition映射该组 .

这在火花中是否可行?我查看了API并且无法提供方法 . 也许我认为问题是错误的 .

请问,有什么建议或建议吗?

EDIT1:

反思它,我得出结论,如果事情在每个分区中分组,那么它很好,但至少我希望每个分区有“大组”而不是让我的组遍布我所拥有的分区 .

从某种意义上说,我想说的是,我希望在同一个分区中共同拥有一个组的元素 .

然后我可以按组映射分区处理组,考虑到我需要执行的操作的性质,可能每组进行一次批处理 .

因此放松约束,问题就变成了,我如何设置火花,使同一组的记录,即共享相同密钥的记录尽可能多地放在同一分区中 .