• Spark广播变量


    广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,甚至是机器学习算法中的一个很大的特征向量,广播变量用起来都很顺手。 在多个并行操作中使用同一个变量,但是 Spark会为每个任务分别发送。

    使用广播变量的过程如下:

    (1) 通过对一个类型 T 的对象调用 SparkContext.broadcast 创建出一个 Broadcast[T] 对象。 任何可序列化的类型都可以这么实现。

    (2) 通过 value 属性访问该对象的值(在 Java 中为 value() 方法)。

    (3) 变量只会被发到各个节点一次,应作为只读值处理(修改这个值不会影响到别的节点)。

    package Spark02
    
    import org.apache.spark.broadcast.Broadcast
    import org.apache.spark.rdd.RDD
    import org.apache.spark.{SparkConf, SparkContext}
    
    object BroadCast {
    
      def main(args : Array[String]):Unit={
    
        // 配置信息
        val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("broadcast")
        // 创建Spark上下文对象
        val sc = new SparkContext(conf)
    
        val rdd1: RDD[(Int, String)] = sc.parallelize(List((1,"a"),(2,"b"),(3,"c")))
    
        val rdd2: RDD[(Int, Int)] = sc.parallelize(List((1,1),(2,2),(3,3)))
    
        // RDD进行join操作
        val joinRDD: RDD[(Int, (String, Int))] = rdd1.join(rdd2)
        joinRDD.foreach(println)
    
    
        // 可以使用广播变量减少数据的传输
        val list = List((1,1),(2,2),(3,3))
        val broadcast: Broadcast[List[(Int, Int)]] = sc.broadcast(list)
    
        val resultRDD: RDD[(Int, (String, Any))] = rdd1.map {
          case (key, value) => {
            var v2: Any = null
            for (elem <- broadcast.value) {
              if (key == elem._1) {
                v2 = elem._2
              }
            }
            (key, (value, v2))
    
          }
        }
        resultRDD.foreach(println)
    
        // 关闭SparkContext
        sc.stop()
    
      }
    
    }
    
  • 相关阅读:
    世界上最遥远的距离(泰戈尔)
    肩周炎?
    [转]C#基础概念二十五问
    [转]ASP.NET 2.0的缓存技术简介
    SQL Server 2005下的分页SQL
    [转]基本的缓存类操作封装(抽象类)
    GridView鼠标经过行变色
    推荐一个好用的.NET2.0下的发送EMail的库
    Data Access Application Block for .NET
    Pet Shop 4.0的缓存机制
  • 原文地址:https://www.cnblogs.com/lucas-zhao/p/12073239.html
Copyright © 2020-2023  润新知