Spark:按键分组,分区映射

时间:2018-08-29 00:47:22

标签: scala apache-spark

我正在使用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:

对此进行反思,我得出的结论是,如果将每个组中的内容分组,那么很好,但是至少我希望每个分区具有“大组”,而不是将我的组散布到所有分区中我有。

从某种意义上说,我想在一个分区中同时放置一个组中的所有元素。

然后,我可以逐组映射分区处理,考虑到我需要执行的操作的性质,也许可以每组分批处理。

因此,放宽约束,问题就变成了,如何设置火花,以使同一组(即共享同一键)的记录尽可能地位于同一分区中。

0 个答案:

没有答案