加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Spark中的分区

发布时间:2020-12-16 10:01:11 所属栏目:安全 来源:网络整理
导读:我通过并行化以下数组创建了一个RDD: var arr: Array[(Int,Char)] = Array()for (i - 'a' to 'z') {arr = arr :+ (1,i)} // Key 1 has 25 elementsfor (i - List.range('a','c')) {arr = arr :+ (2,i)} // Key 2 has 2for (i - List.range('a','f')) {arr =
我通过并行化以下数组创建了一个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)?如果是这样,那你就不走运了.如果没有,那么我们可以通过键/值组合分区而不仅仅是键来玩一些技巧!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读