IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Flink1.10实战:自定义聚合函数AggregateFunction -> 正文阅读

[大数据]Flink1.10实战:自定义聚合函数AggregateFunction

作者:treeSkill

??? Flink 的AggregateFunction是一个基于中间计算结果状态进行增量计算的函数。由于是迭代计算方式,所以,在窗口处理过程中,不用缓存整个窗口的数据,所以效率执行比较高。

@PublicEvolving

public interface AggregateFunction<IN, ACC, OUT> extends Function, Serializable {

...............................

}

自定义聚合函数需要实现AggregateFunction接口类,它有四个接口实现方法:

a.创建一个新的累加器,启动一个新的聚合,负责迭代状态的初始化

ACC createAccumulator();
b.对于数据的每条数据,和迭代数据的聚合的具体实现

ACC add(IN value, ACC accumulator);
c.合并两个累加器,返回一个具有合并状态的累加器

ACC merge(ACC a, ACC b);
d.从累加器获取聚合的结果

OUT getResult(ACC accumulator);

3.自定义聚合函数MyCountAggregate

  1. package com.hadoop.ljs.flink110.aggreagate;
    import org.apache.flink.api.common.functions.AggregateFunction;
    /**
     * @author: Created By lujisen
     * @company ChinaUnicom Software JiNan
     * @date: 2020-04-15 22:00
     * @version: v1.0
     * @description: com.hadoop.ljs.flink110.aggreagate
     * 输入类型(IN)、累加器类型(ACC)和输出类型(OUT)。
     */
    public class MyCountAggregate implements AggregateFunction<ProductViewData, Long, Long> {
        @Override
        public Long createAccumulator() {
            /*访问量初始化为0*/
            return 0L;
        }
        @Override
        public Long add(ProductViewData value, Long accumulator) {
            /*访问量直接+1 即可*/
            return accumulator+1;
        }
        @Override
        public Long getResult(Long accumulator) {
            return accumulator;
        }
        /*合并两个统计量*/
        @Override
        public Long merge(Long a, Long b) {
            return a+b;
        }
    }
    

    4.自定义窗口函数

  2. package com.hadoop.ljs.flink110.aggreagate;
    import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
    import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
    import org.apache.flink.util.Collector;
    /**
     * @author: Created By lujisen
     * @company ChinaUnicom Software JiNan
     * @date: 2020-04-15 21:56
     * @version: v1.0
     * @description: com.hadoop.ljs.flink110.aggreagate
     *  *自定义窗口函数,封装成字符串
     *  *第一个参数是上面MyCountAggregate的输出,就是商品的访问量统计
     *  * 第二个参数 输出 这里为了演示 简单输出字符串
     *  * 第三个就是 窗口类 能获取窗口结束时间
     */
    public class MyCountWindowFunction2 implements WindowFunction<Long,String,String, TimeWindow> {
    @Override
    public void apply(String productId, TimeWindow window, Iterable<Long> input, Collector<String> out) throws Exception {
         /*商品访问统计输出*/
        /*out.collect("productId"productId,window.getEnd(),input.iterator().next()));*/
        out.collect("----------------窗口时间:"+window.getEnd());
        out.collect("商品ID: "+productId+"  浏览量: "+input.iterator().next());
        }
    
    

    5.主函数,代码如下:

  3. import org.apache.flink.api.common.functions.FilterFunction;
    import org.apache.flink.api.common.functions.MapFunction;
    import org.apache.flink.api.java.functions.KeySelector;
    import org.apache.flink.streaming.api.TimeCharacteristic;
    import org.apache.flink.streaming.api.datastream.DataStream;
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    import org.apache.flink.streaming.api.functions.timestamps.AscendingTimestampExtractor;
    import org.apache.flink.streaming.api.windowing.time.Time;
     
    /**
     * @author: Created By lujisen
     * @company ChinaUnicom Software JiNan
     * @date: 2020-04-14 11:28
     * @version: v1.0
     * @description: com.hadoop.ljs.flink110.aggreagate
     * 自定义聚合函数类和窗口类,进行商品访问量的统计,根据滑动时间窗口,按照访问量排序输出
     */
    public class AggregateFunctionMain2 {
     
        public  static int windowSize=6000;/*滑动窗口大小*/
        public  static int windowSlider=3000;/*滑动窗口滑动间隔*/
        
        public static void main(String[] args) throws Exception {
            StreamExecutionEnvironment senv = StreamExecutionEnvironment.getExecutionEnvironment();
            senv.setParallelism(1);
            senv.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
            /*DataStream<String> sourceData = senv.socketTextStream("localhost",9000);*/ 
            //从文件读取数据,也可以从socket读取数据       
            DataStream<String> sourceData = senv.readTextFile("D:\\projectData\\ProductViewData2.txt");
            DataStream<ProductViewData> productViewData = sourceData.map(new MapFunction<String, ProductViewData>() {
                @Override
                public ProductViewData map(String value) throws Exception {
                    String[] record = value.split(",");
                    return new ProductViewData(record[0], record[1], Long.valueOf(record[2]), Long.valueOf(record[3]));
                }
            }).assignTimestampsAndWatermarks(new AscendingTimestampExtractor<ProductViewData>(){
                @Override
                public long extractAscendingTimestamp(ProductViewData element) {
                    return element.timestamp;
                }
            });
            /*过滤操作类型为1  点击查看的操作*/
            DataStream<String> productViewCount = productViewData.filter(new FilterFunction<ProductViewData>() {
                @Override
                public boolean filter(ProductViewData value) throws Exception {
                    if(value.operationType==1){
                        return true;
                    }
                    return false;
                }
            }).keyBy(new KeySelector<ProductViewData, String>() {
                @Override
                public String getKey(ProductViewData value) throws Exception {
                    return value.productId;
                }
                //时间窗口 6秒  滑动间隔3秒
            }).timeWindow(Time.milliseconds(windowSize), Time.milliseconds(windowSlider))
            /*这里按照窗口进行聚合*/
            .aggregate(new MyCountAggregate(), new MyCountWindowFunction2());
            //聚合结果输出
            productViewCount.print();
     
            senv.execute("AggregateFunctionMain2");
        }
    }
    

    ???这里自定义聚合函数演示完毕,感谢关注!!!

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:46:40  更:2021-11-11 12:47:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:17:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码