作家
登录

Spark源码分析之分区器的作用

作者: 来源: 2017-04-24 14:03:54 阅读 我要评论

else { 
  •             // The weight is 1 over the sampling probability. 
  •             val weight = (n.toDouble / sample.size).toFloat 
  •             for (key <- sample) { 
  •               candidates += ((key, weight)) 
  •             } 
  •           } 
  •         } 
  •         if (imbalancedPartitions.nonEmpty) { 
  •           // Re-sample imbalanced partitions with the desired sampling probability. 
  •           val imbalanced = new PartitionPruningRDD(rdd.map(_._1), imbalancedPartitions.contains
  •           val seed = byteswap32(-rdd.id - 1) 
  •           //基于RDD获取采样数据 
  •           val reSampled = imbalanced.sample(withWordStrment = false, fraction, seed).collect() 
  •           val weight = (1.0 / fraction).toFloat 
  •           candidates ++= reSampled.map(x => (x, weight)) 
  •         } 
  • 掏出样本后,就到了肯定界线的时刻了。

    留意每个key都邑有一个权重,这个权重是 【分区的数据总数/样本数】

    1. RangePartitioner.determineBounds(candidates, partitions) 

    起首排序val ordered = candidates.sortBy(_._1),然后肯定一个权重的步长

    1. val sumWeights = ordered.map(_._2.toDouble).sum 
    2. val step = sumWeights / partitions 

    基于该步长,肯定界线,最后就形成了几个范围数据。

    然后分区器形成二叉树,遍历该数肯定每个key对应的分区id

    1. partition = binarySearch(rangeBounds, k) 

    实践 —— 自定义分区器

    自定义分区器,也是很简单的,只须要实现对应的两个办法就行:

    1. public class MyPartioner extends Partitioner { 
    2.     @Override 
    3.     public int numPartitions() { 
    4.         return 1000; 
    5.     } 
    6.  
    7.     @Override 
    8.     public int getPartition(Object key) { 
    9.         String k = (String) key

        推荐阅读

        SDN能解决很多问题,但不包括安全

      跟着数字化企业尽力寻求最佳安然解决筹划来保护其赓续扩大的收集,很多企颐魅正在寻求供给互操作性功能的下一代对象。软件定义收集(SDN)具有很多的优势,经由过程将多个设备的┞菲握平面整>>>详细阅读


      本文标题:Spark源码分析之分区器的作用

      地址:http://www.17bianji.com/lsqh/34919.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)