代码之家  ›  专栏  ›  技术社区  ›  MaatDeamon

Spark:按键分组,在分区上映射

  •  0
  • MaatDeamon  · 技术社区  · 6 年前

    我用的是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,使得同一组的记录,即共享相同的密钥,尽可能地在同一个分区中被调用。

    0 回复  |  直到 6 年前