• spark分区器


    1、spark中默认的分区器:

      Spark目前支持Hash分区和Range分区,用户也可以自定义分区,Hash分区为当前的默认分区,Spark中分区器直接决定了RDD中分区的个数、RDD中每条数据经过Shuffle过程属于哪个分区和Reduce的个数。

    • 只有Key-Value类型的RDD才有分区器的,非Key-Value类型的RDD分区器的值是None
    • 每个RDD的分区ID范围:0~numPartitions-1,决定这个值是属于那个分区的
    • https://www.iteblog.com/archives/1522.html 过往记忆源码解析

    2、在项目中的实际使用场景:

      求分组topn:

    (1)利用自定义分区器,按照key进行分区,使不同的key进入到不同的分区当中。分区完之后就可以对每个分区单独操作使用 mapPartitions。

    (2)对每个分区内部进行排序。

    //自定义一个分区器,并且按照指定的分区器进行分区
        val sbPatitioner = new SubjectParitioner2(subjects)
    
        //聚合,聚合是就按照指定的分区器进行分区
        //该RDD一个分区内仅有一个学科的数据
        val reduced: RDD[((String, String), Int)] = sbjectTeacherAndOne.reduceByKey(sbPatitioner, _+_)
    
        //如果一次拿出一个分区(可以操作一个分区中的数据了)
        val sorted: RDD[((String, String), Int)] = reduced.mapPartitions(it => {
          //将迭代器转换成list,然后排序,在转换成迭代器返回
          it.toList.sortBy(_._2).reverse.take(topN).iterator
    
          //即排序,有不全部加载到内存
    
          //长度为5的一个可以排序的集合
    
        })
    
        //收集结果
        //val r: Array[((String, String), Int)] = sorted.collect()
        //println(r.toBuffer)
    
        sorted.saveAsTextFile("/Users/zx/Desktop/out")
    //自定义分区器
    class SubjectParitioner2(sbs: Array[String]) extends Partitioner {
    
      //相当于主构造器(new的时候回执行一次)
      //用于存放规则的一个map
      val rules = new mutable.HashMap[String, Int]()
      var i = 0
      for(sb <- sbs) {
        //rules(sb) = i
        rules.put(sb, i)
        i += 1
      }
    
      //返回分区的数量(下一个RDD有多少分区)
      override def numPartitions: Int = sbs.length
    
      //根据传入的key计算分区标号
      //key是一个元组(String, String)
      override def getPartition(key: Any): Int = {
        //获取学科名称
        val subject = key.asInstanceOf[(String, String)]._1
        //根据规则计算分区编号
        rules(subject)
      }
    }

    参考博客:https://www.jianshu.com/p/a10d92bbeacf

  • 相关阅读:
    一行代码轻松修改 Text Field 和 Text View 的光标颜色 — By 昉
    六种手势识别,你用了哪些?——董鑫
    Mac 屏幕录制Gif 制作 By-胡罗
    利用ICMP协议的PING命令获取客户端当前网络质量 by徐文棋
    iOS加载Gif图片的N种方式 By-H罗
    [手游项目3]-10-Go语言atomic原子操作
    [手游项目3]-9-Go语言sync.Map(在并发环境中使用的map)
    LRU原理和Redis实现
    Cleanup failed to process the following paths错误的解决
    [手游项目3]-8-排行榜redis实现
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12309649.html
Copyright © 2020-2023  润新知