spark常用算子

1、filter

filter 算子使用
通过函数筛选出需要的数据元素,返回true表示保留,返回false表示抛弃
复制代码
 1 public class FilterOperator {
 2     public static void main(String[] args){
 3         SparkConf conf = new SparkConf().setMaster("local").setAppName("filter");
 4         JavaSparkContext sc = new JavaSparkContext(conf);
 5         List<Integer> names = Arrays.asList(12,56,5,14,44);
 6         JavaRDD<Integer> nameRdd = sc.parallelize(names);
 7         JavaRDD<Integer> result = nameRdd.filter(new Function<Integer, Boolean>() {
 8             @Override
 9             public Boolean call(Integer integer) throws Exception {
10                 if(integer<10) {
11                     return false;
12                 }
13                 return true;
14             }
15         });
16 }
复制代码

筛选前:12,56,5,14,44

筛选后:12,56,14,44       

2、UpdateStateByKey

1.说明
SparkStreaming的一般是7天24小时不停息的运行,而在运行的时候,中间会有很多的状态,而有些状态我们需要一些操作,比如累计,更新或者其他的操作。那么如何将这些独立的状态联系起来就成了一种迫切的需求。

2.介绍
UpdateStateByKey的主要功能:

2.1、为Spark Streaming中每一个Key维护一份state状态,state类型可以是任意类型的, 可以是一个自定义的对象,那么更新函数也可以是自定义的。
2.2、通过更新函数对该key的状态不断更新,对于每个新的batch而言,Spark Streaming会在使用updateStateByKey的时候为已经存在的key进行state的状态更新。

2.3、updateStateByKey功能是按照key进行分组,将该批次的value数据和上一个批次该key的value进行一个状态值的更新。
注意:
使用到updateStateByKey要开启checkpoint机制和功能,很简单,只要调用jssc的checkpoint()方法,设置一个hdfs目录即可。

多久会将内存中的数据写入到磁盘一份?
如果batchInterval设置的时间小于10秒,那么10秒写入磁盘一份。如果batchInterval设置的时间大于10秒,那么就会batchInterval时间间隔写入磁盘一份

原文链接:https://blog.csdn.net/weixin_41843918/article/details/89456748

3、下面举个例子,原文链接:https://blog.csdn.net/i_m_jack/article/details/90678253

复制代码
  1 import java.util.Arrays;
  2 import java.util.List;
  3 import java.util.Properties;
  4 
  5 import org.apache.spark.SparkConf;
  6 import org.apache.spark.api.java.function.FlatMapFunction;
  7 import org.apache.spark.api.java.function.Function2;
  8 import org.apache.spark.api.java.function.PairFunction;
  9 import org.apache.spark.streaming.Durations;
 10 import org.apache.spark.streaming.api.java.JavaDStream;
 11 import org.apache.spark.streaming.api.java.JavaPairDStream;
 12 import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
 13 import org.apache.spark.streaming.api.java.JavaStreamingContext;
 14 
 15 import com.google.common.base.Optional;
 16 
 17 import scala.Tuple2;
 18 
 19 /**
 20  * 基于updateStateByKey算子实现缓存机制的实时wordcount程序
 21  * @author Administrator
 22  *
 23  */
 24 
 25 
 26 public class UpdateStateByKeyWordCount {
 27 
 28     public static void main(String[] args) {
 29         Properties properties = System.getProperties();
 30         properties.setProperty("HADOOP_USER_NAME", "root");
 31         
 32         
 33         
 34         SparkConf conf = new SparkConf()
 35                 .setMaster("local[2]")
 36                 .setAppName("UpdateStateByKeyWordCount");  
 37         JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(5));
 38         
 39         // 第一点,如果要使用updateStateByKey算子,就必须设置一个checkpoint目录,开启checkpoint机制
 40         // 这样的话才能把每个key对应的state除了在内存中有,那么是不是也要checkpoint一份
 41         // 因为你要长期保存一份key的state的话,那么spark streaming是要求必须用checkpoint的,以便于在
 42         // 内存数据丢失的时候,可以从checkpoint中恢复数据
 43         
 44         // 开启checkpoint机制,很简单,只要调用jssc的checkpoint()方法,设置一个hdfs目录即可
 45         jssc.checkpoint("hdfs://master:9000/wordcount_checkpoint");  
 46         
 47         // 然后先实现基础的wordcount逻辑
 48         //JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999);
 49         JavaReceiverInputDStream<String> lines = jssc.socketTextStream("192.168.142.11", 9999);
 50         
 51         JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
 52 
 53             private static final long serialVersionUID = 1L;
 54 
 55             @Override
 56             public Iterable<String> call(String line) throws Exception {
 57                 return Arrays.asList(line.split(" "));  
 58             }
 59             
 60         });
 61         
 62         JavaPairDStream<String, Integer> pairs = words.mapToPair(
 63                 
 64                 new PairFunction<String, String, Integer>() {
 65 
 66                     private static final long serialVersionUID = 1L;
 67 
 68                     @Override
 69                     public Tuple2<String, Integer> call(String word)
 70                             throws Exception {
 71                         return new Tuple2<String, Integer>(word, 1);
 72                     }
 73                     
 74                 });
 75         
 76         // 到了这里,就不一样了,之前的话,是不是直接就是pairs.reduceByKey
 77         // 然后,就可以得到每个时间段的batch对应的RDD,计算出来的单词计数
 78         // 然后,可以打印出那个时间段的单词计数
 79         // 但是,有个问题,你如果要统计每个单词的全局的计数呢?
 80         // 就是说,统计出来,从程序启动开始,到现在为止,一个单词出现的次数,那么就之前的方式就不好实现
 81         // 就必须基于redis这种缓存,或者是mysql这种db,来实现累加
 82         
 83         // 但是,我们的updateStateByKey,就可以实现直接通过Spark维护一份每个单词的全局的统计次数
 84         JavaPairDStream<String, Integer> wordCounts = pairs.updateStateByKey(
 85                         //import com.google.common.base.Optional;//注意是这个包
 86                 
 87                 // 这里的Optional,相当于Scala中的样例类,就是Option,可以这么理解
 88                 // 它代表了一个值的存在状态,可能存在,也可能不存在
 89                 new Function2<List<Integer>, Optional<Integer>, Optional<Integer>>() {
 90 
 91                     private static final long serialVersionUID = 1L;
 92 
 93                     // 这里两个参数
 94                     // 实际上,对于每个单词,每次batch计算的时候,都会调用这个函数
 95                     // 第一个参数,values,相当于是这个batch中,这个key的新的值,可能有多个吧
 96                     // 比如说一个hello,可能有2个1,(hello, 1) (hello, 1),那么传入的是(1,1)
 97                     // 第二个参数,就是指的是这个key之前的状态,state,其中泛型的类型是你自己指定的
 98                     @Override
 99                     public Optional<Integer> call(List<Integer> values,
100                             Optional<Integer> state) throws Exception {
101                         System.out.println("+++++++++++++++++++++++++++++++");
102                         System.out.println("values:   "+values);
103                         System.out.println("state:    "+state);
104                         
105                         System.out.println("===================================");
106                         
107                         
108                         // 首先定义一个全局的单词计数
109                         Integer newValue = 0;
110                         
111                         // 其次,判断,state是否存在,如果不存在,说明是一个key第一次出现
112                         // 如果存在,说明这个key之前已经统计过全局的次数了
113                         if(state.isPresent()) {
114                             newValue = state.get();
115                         }
116                         
117                         // 接着,将本次新出现的值,都累加到newValue上去,就是一个key目前的全局的统计
118                         // 次数
119                         for(Integer value : values) {
120                             newValue += value;
121                         }
122                         
123                         return Optional.of(newValue);  
124                     }
125                     
126                 });
127         
128         // 到这里为止,相当于是,每个batch过来是,计算到pairs DStream,就会执行全局的updateStateByKey
129         // 算子,updateStateByKey返回的JavaPairDStream,其实就代表了每个key的全局的计数
130         // 打印出来
131         wordCounts.print();
132         
133         jssc.start();
134         jssc.awaitTermination();
135         jssc.close();
136     }
137     
138 }
复制代码

 

posted @   巴啦啦小花总  阅读(349)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示