我用的是spark 2.3.1。
我正在努力解决下面的问题。我有成对的数据(密钥,数据)。但是由于我需要对数据执行的操作的性质,我需要运行一个映射分区。这是因为我需要在每个分区内实例化一个不可序列化的对象,以执行需要执行的转换。
出于性能原因,我希望每个分区只包含特定密钥的数据。
在某种意义上,我想按键分组,然后映射到这些组上?但是,组上的映射不等于分区上的映射。根据我的经验,多个组可以在同一个分区中。
运行以下代码将显示它。
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([爱尔兰,美国,335])
CompactBuffer([百慕大,美国,183])CompactBuffer([美国]
国家,墨西哥,7187)
===
===
CompactBuffer([巴拉圭,美国,60])
CompactBuffer([法国,美国,935])CompactBuffer([美国]
国家,帕劳,31])CompactBuffer([美国,约旦,44],
[约旦,美国,44],[马提尼克,美国,44])
===
这完全不是我想要的。我希望每个分区只有一个组,并使用map partition映射到该组上。
这在spark中可行吗?我检查了一下API,但找不到方法。也许我是把问题想错了。
有什么建议或建议吗?
编辑1:
经过思考,我得出了这样的结论:如果事物被分组在每个分区中,那就没问题了,但至少我希望每个分区都有“大组”,而不是让我的组分布在我所有的分区上。
从某种意义上说,我想让同一个分区中有同样多的组元素。
然后我可以逐组映射分区处理,可能根据需要执行的操作的性质,对每个组进行一点批处理。
因此,放宽约束,问题就变成了,如何设置SKOT,使得同一组的记录,即共享相同的密钥,尽可能地在同一个分区中被调用。