Scala Spark:按键分组,分区映射

Scala Spark:按键分组,分区映射,scala,apache-spark,Scala,Apache Spark,我用的是spark 2.3.1 我正在努力解决以下问题。我有成对的数据(密钥、数据)。但是,由于我需要对数据执行的操作的性质,我需要运行一个映射分区。这是因为我需要在每个分区内实例化一个不可序列化的对象,以执行我需要执行的转换 出于性能原因,我希望每个分区只包含特定密钥的数据 从某种意义上说,我想按键分组,并映射到这些组?但是,组上的映射并不等于分区上的映射。根据我运行的经验,多个组可以位于同一分区内 运行以下代码可以显示它 partioneddf.rdd.groupBy(r => r(2

我用的是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])压缩缓冲区([美国 美国,危地马拉,318])CompactBuffer([卢森堡,美国,155])

===

CompactBuffer([秘鲁,美国,279])CompactBuffer([美国 国家,奥地利,63],[美国,圭亚那,63]) CompactBuffer([爱尔兰、美国,335]) CompactBuffer([百慕大,美国,183])CompactBuffer([美国 各州(墨西哥,7187])

===

===

CompactBuffer([巴拉圭、美国,60]) CompactBuffer([法国,美国,935])CompactBuffer([美国 美国,帕劳,31])CompactBuffer([美国,约旦,44], [约旦,美国,44],[马提尼克岛,美国,44])

===

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

这在spark中是否可行?我检查了API,但没有找到方法。也许我认为问题出在哪里了

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

EDIT1:

经过思考,我得出结论,如果在每个分区中对事物进行分组,那么这很好,但至少我希望每个分区都有“大组”,而不是让我的组分布在我所有的分区上

从某种意义上说,我想说的是,我希望一个组中有尽可能多的元素位于同一分区中

然后我可以一组一组地映射分区处理,根据我需要执行的操作的性质,可能会对每个组进行一点批处理


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

您必须使用:-数据框的示例输入数据、其模式和所需输出进行更新。正如您的问题,我们不知道如何确定两行在同一组中。无论如何,如果您需要使用不可序列化的对象进行转换。您可以在每个执行器中初始化该对象,而不是在驱动程序上初始化它,并将其序列化到执行器。谢谢您的回复。第二点已经在我的需求中了。我不太明白你的第一句话。你能解释一下吗?你能把你的数据框的输入数据样本,它的模式和期望的输出发布出来吗