spark 聚合和广播

原创 2018年04月15日 15:34:58

本文主要通过代码实现spark的聚合和广播两个特殊的算子

1 广播变量或者少量的数据,可以起到优化功能

import java.util.Arrays;
import java.util.List;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.broadcast.Broadcast;

/**
 * 广播变量
 * @author Administrator
 *
 */
public class BroadcastVariable {

   public static void main(String[] args) {
      SparkConf conf = new SparkConf()
            .setAppName("BroadcastVariable") 
            .setMaster("local"); 
      JavaSparkContext sc = new JavaSparkContext(conf);
   
      // 在java中,创建共享变量,就是调用SparkContext的broadcast()方法
      // 获取的返回结果是Broadcast<T>类型
      final int factor = 3;
      final Broadcast<Integer> factorBroadcast = sc.broadcast(factor);
      
      List<Integer> numberList = Arrays.asList(1, 2, 3, 4, 5);
      
      JavaRDD<Integer> numbers = sc.parallelize(numberList);
      
      // 让集合中的每个数字,都乘以外部定义的那个factor
      JavaRDD<Integer> multipleNumbers = numbers.map(new Function<Integer, Integer>() {

         private static final long serialVersionUID = 1L;
         
         @Override
         public Integer call(Integer v1) throws Exception {
            // 使用共享变量时,调用其value()方法,即可获取其内部封装的值
            int factor = factorBroadcast.value();
            return v1 * factor;
         }
         
      });
      
      multipleNumbers.foreach(new VoidFunction<Integer>() {
         
         private static final long serialVersionUID = 1L;
         
         @Override
         public void call(Integer t) throws Exception {
            System.out.println(t);  
         }
         
      });
      
      sc.close();
   }
   
}

2 accumulator聚合器 通长用来统计用户的session会话聚合

import org.apache.spark.Accumulator;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.VoidFunction;

/**
 * 累加变量
 * @author Administrator
 *
 */
public class AccumulatorVariable {

   public static void main(String[] args) {
      SparkConf conf = new SparkConf()
            .setAppName("Accumulator") 
            .setMaster("local");
      JavaSparkContext sc = new JavaSparkContext(conf);
   
      // 创建Accumulator变量
      // 需要调用SparkContext的accumulator()方法
      final Accumulator<Integer> sum = sc.accumulator(0);
      
      List<Integer> numberList = Arrays.asList(1, 2, 3, 4, 5);
      JavaRDD<Integer> numbers = sc.parallelize(numberList);
      
      numbers.foreach(new VoidFunction<Integer>() {
         
         private static final long serialVersionUID = 1L;

         @Override
         public void call(Integer t) throws Exception {
            // 然后在函数内部,就可以对Accumulator变量,调用add()方法,累加值
            sum.add(t);  
         }
         
      });
      
      // 在driver程序中,可以调用Accumulator的value()方法,获取其值
      System.out.println(sum.value());  
      
      sc.close();
   }
   
}

解析C语言中的sizeof

解析C语言中的sizeof(作者:方敏、吴鸣鸣 2001年01月08日 15:28)一、sizeof的概念   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。s...
  • ghj1976
  • ghj1976
  • 2001-01-12 21:02:00
  • 1738

Spark中广播变量知识点

为什么要使用广播变量,广播变量的好处及用法
  • caiyefly
  • caiyefly
  • 2017-08-25 11:00:31
  • 2186

Spark性能调优之——在实际项目中广播大变量

Spark Application Driver 进程,其实就是我们写的Spark作业,打成jar运行起来的进程。比如一个1M的map(随机抽取的map) ,创建1000个副本,网络传输!分到1000...
  • lxhandlbb
  • lxhandlbb
  • 2016-10-31 22:23:45
  • 2973

Spark之广播变量

private static void broadCastOps(JavaSparkContext sc) { //加载user表到rdd JavaRDD linesRDD = sc....
  • tangshiweibbs
  • tangshiweibbs
  • 2017-04-19 14:38:17
  • 1173

spark性能调优之广播大变量

广播变量,很简单 其实就是SparkContext的broadcast()方法,传入你要广播的变量,即可 final Broadcast>> broadcast = sc.broadcast(fa...
  • hutao_hadoop
  • hutao_hadoop
  • 2016-09-28 21:34:40
  • 6528

spark更新广播变量实例

实际项目中需要使用更新广播变量的方式来满足需求,其代码具体如下: @NotProguard public class WbBroadcastWrapper { Broadcast> broad...
  • geeksu
  • geeksu
  • 2017-10-11 00:27:48
  • 324

JavaSpark-编程进阶-广播变量

程序高效地向所有worker发送一个较大的只读值(查询表,机器学习特征向量),供spark操作使用。 spark会自动将闭包中所有引用的到的变量发送到工作节点上,但低效: 默认的发送机制是专门为小任...
  • m0_37636453
  • m0_37636453
  • 2017-12-11 19:09:07
  • 362

spark SQL (二) 聚合

spark SQL (二) 聚合
  • m0_37138008
  • m0_37138008
  • 2017-12-23 16:48:08
  • 132

Spark 广播变量(broadcast)更新方法

Spark 广播变量(broadcast)更新方法更新方法spark 广播变量可以通过unpersist方法删除,然后重新广播 val map = sc.textFile("/test.txt").m...
  • xueba207
  • xueba207
  • 2017-06-05 11:19:15
  • 2845

Spark SQL中的聚合(Aggregate)实现

Spark SQL中的聚合(Aggregate)实现Sort Based Aggregate首先来说说实现比较简单(但实际执行起来却不简单)的Sort Based Aggregate。顾名思义,这是一...
  • doggie_wangtao
  • doggie_wangtao
  • 2017-04-08 16:50:08
  • 2334
收藏助手
不良信息举报
您举报文章:spark 聚合和广播
举报原因:
原因补充:

(最多只允许输入30个字)