gpt4 book ai didi

scala - Spark 中的分区

转载 作者:行者123 更新时间:2023-12-01 01:56:06 25 4
gpt4 key购买 nike

我通过并行化以下数组创建了一个 RDD:

var arr: Array[(Int,Char)] = Array()
for (i <- 'a' to 'z') {arr = arr :+ (1,i)} // Key 1 has 25 elements
for (i <- List.range('a','c')) {arr = arr :+ (2,i)} // Key 2 has 2
for (i <- List.range('a','f')) {arr = arr :+ (3,i)} // Key 3 has 5
val rdd = sc.parallelize(arr,8)

我想对上面的 RDD 进行分区,以便每个分区接收不同的键 分区的大小几乎相同。下面的代码允许我通过键对 RDD 进行分区:
val prdd = rdd.partitionBy(new HashPartitioner(3))

上述代码创建的分区具有以下大小:
 scala> prdd.mapPartitions(iter=> Iterator(iter.length)).collect
res43: Array[Int] = Array(25, 2, 5)

有没有办法让这个rdd的分区大小几乎相等?例如,对于上面的情况,键 1 的最大分区大小为 25。我可以有如下分区大小:
Array[Int] = Array(5, 5, 5, 5, 5, 2, 5)

我试着做 RangePartition以上 prdd但它没有用。

最佳答案

您遇到的问题是数据固有的。

  • 您的 key 分布非常不平衡
  • 您希望将所有键组合在一起。

  • 鉴于这两个,真的没有办法平均分配!如果您在第一次调用 parallelize 时打印分区大小,你会看到分区是比较平衡的—— sc.parallelize将均匀地分 block 数据。

    Spark 分区器提供来自 Key K 的确定性函数分区索引 p .在保留此功能的同时,无法为“1”键设置多个分区。范围分区对于维护 RDD 上的顺序很有用,但在这里无济于事——对于任何给定的键,您只需要查看一个分区。

    您是否正在分区以便可以执行键/值 RDD 操作,例如 joinreduceByKey之后?如果是这样,那你就不走运了。如果没有,那么我们可以通过键/值组合来玩一些技巧,而不仅仅是键!

    关于scala - Spark 中的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365241/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com