scala – Spark中的分区
我通过并行化以下数组创建了一个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) 我尝试在上面的prdd上做RangePartition,但它没有用. 解决方法
您遇到的问题是数据中固有的问题.
>您的密钥分布非常不平衡 鉴于这两者,真的没有办法实现均匀分配!如果在第一次调用parallelize时打印分区大小,您将看到分区相对平衡 – sc.parallelize将均匀地分块数据. Spark分区器提供从Key K到分区索引p的确定性函数.在保留此功能的同时,“1”键无法使用多个分区.范围分区对于维护RDD上的顺序很有用,但在这里没有帮助 – 对于任何给定的密钥,只需要查看一个分区. 您是否正在进行分区,以便稍后可以执行键/值RDD操作(如join或reduceByKey)?如果是这样,那你就不走运了.如果没有,那么我们可以通过键/值组合分区而不仅仅是键来玩一些技巧! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |