• flink_tableApi/Flink_Sql_2


    table
    1. 实体表
      catalog 目录
      database 数据库
      table 表

       创建表
      
    	tableEnv
    		.connect(...) 链接外部/定义表的数据来源
    		.withFormat(...) 数据格式化方法
    		.withSchema(...) 定义表结构
    		.createTemporaryTable("mytable");
    
    	表查询
    	更新模式
    		追加append模式
    			只做插入操作insert
    		撤回(retract)模式
    			插入操作add 删除操作retract撤回 更新操作将上一条retract和下一条add
    		更新插入upsert模式
    			更新和插入编码为upsert 删除编码为deleted 需要指定key
    	table 转换成 dataStream
    		追加模式append mode
    		tableEnv.toAppendStream(resultTable,Row.class);
    		撤回模式retract mode
    		tableEnv.toRetractStream(resultTable,Row.class);
    	dataStream 转换成 table
    		tableEnv.fromDataStream(dataSteram);
    		指定表的字段名
    		tableEnv.fromDataStream(dataSteram,"id,time as ts");
    	创建临时视图 temporary view
    		datastream 创建临时视图
    			tableEnv.createtTemporaryView("sensor",dataStream,"id,time as ts")
    		table创建临时视图
    			tableEnv.createTemporaryView("sensor",sensorTable)
    	查看执行计划
    			tableEnv.explain(table);
    
    1. 视图
    2. 动态表 dynamic table
    3. 时间特性 time attributes
      处理时间processing time
    tableEnv.fromDataStream(dataStream,"id,temperature,timestamp as ts,pt.proctime");
    
    	事件时间
    
    	.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SensorReading>(Time.seconds(2)) {
                @Override
                public long extractTimestamp(SensorReading sensorReading) {
                    return sensorReading.getTimestamp();
                }
            });
    	env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    	tableEnv.fromDataStream(dataStream, "id,temperature,timestamp.rowtime as ts,pt.proctime");
    
    窗口
    input.window([w:GroupWindow] as "w")
    .groupBy("w,a")
    .select("a,b.sum")
    
    	滚动窗口 tumbling window
    
    // sql
    select id,count(id) as cnt,avg(temp) as avgTemp,tumble_end(ts,interval '10' second) from sensor group by id tumble(ts,interval '10' second)
    
    // 事件时间窗口 api
    .window(Tumble.over("10.minutes").on("rowtime").as("w"))
    // 滚动时间窗口 api
    .window(Tumble.over("10.minutes").on("proctime").as("w"))
    // 计数窗口
    .window(Tumle.over("10.rows").on("proctime").as("w"))
    
    	滑动窗口 sliding windows
    
    //sql
    HOP(time_attr,滑动步长,窗口长度)
    // 滑动事件时间窗口 api
    .window(Slide.over("10.minutes").every("5.minutes").on("rowtime").as("w"))
    // 滑动处理时间窗口
    .window(Slide.over("10.minutes").every("5.minutes").on("proctime").as("w"))
    // 滑动计数窗口
    .window(Slide.over("10.rows").every("5.minutes").on("proctime").as("w"))
    
    	会话窗口 session windows
    
    //sql
    SESSION(time_attr时间字段,窗口间隔)
    // 事件时间session窗口
    .window(Session.withGap("10.minutes").on("rowtime").as("w"))
    // 处理时间session窗口
    .window(Session.withGap("10.minutes").on("proctime").as("w"))
    

    over windows
    无界over windows

    preceding 之前的
    following 之后的
    // 无界的事件时间 
    .window(Over.partitionBy("a").orderBy("rowtime").preceding(UNBOUNDED_RANGE).as("w"))
    // 无界的处理时间
    .window(Over.partitionBy("a").orderBy("proctime").preceding(UNBOUNDED_RANGE).as("w"))
    // 无界的事件时间 row count
    .window(Over.partitionBy("a").orderBy(rowtime).preceding(UNBOUNDED_ROW).as("w"))
    // 无界的处理时间 row count
    .window(Over.partitionBy("a").orderBy(proctime).preceding(UNBOUNDED_ROW).as("w"))
    
    有界over windows
    
    // 有界的事件时间
    .window(Over.partitionBy("a").orderBy("rowtime").preceding("1.minutes").as("w"))
    // 有界的处理时间
    .window(Over.partitionBy("a").orderBy("proctime").preceding("1.minutes").as("w"))
    // 有界的事件时间 row count
    .window(Over.partitionBy("a").orderBy("rowtime").preceding("10.rows").as("w"))
    // 有界的处理时间 row count
    .window(Over.partitionBy('a').orderBy("proctime").preceding("10.rows").as("w"))
    
    select id,ts,count(id) over ow,avg(temp) over ow
    from sensor
    window ow as (
    partition by id 
    order by ts 
    rows between 2 preceding and current row)
    

    函数

    **字符函数 上面sql 下面api**
    字符串拼接
    s1 || s2 
    s1 + s2
    字符串转大写
    upper(s)
    string.uppercase()
    字符串长度
    char_length()
    string.charlength()
    
    **时间函数**
    字符转date
    date s
    string.todate
    字符转时间戳
    timestamp string
    string.totimestamp
    当前时间
    current_time
    currenttime()
    一段时间
    interval string range interval ‘1’ second 单数
    numeric.days  1.days 1.minutes
    
    **聚合函数**
    计算个数
    count()
    field.count
    总和
    sum()
    field.sum0
    
    rank()
    row_number()
    

    用户自定义函数

    标量函数scalar functions 只返回一个值
    	继承ScalarFunction 自定义函数 注册然后使用
    表函数 table functions 返回任何数量的行
    	继承tablefunction
    聚合函数 aggregate function 多个值聚合返回一个标量值
    	继承 aggregatefunction 实现 createaccumulator
    表聚合函数 多个值聚合返回多个值相当于一个表
    	继承tableaggregatefunction
  • 相关阅读:
    两个链表的第一个公共结点
    数组中的逆序对
    C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)
    第一个只出现一次的字符
    机器学习算法速览表
    丑数
    设计模式---行为型设计模式【策略模式】
    设计模式---行为型设计模式【备忘录模式】
    设计模式----创建型设计模式【单例模式】
    设计模式----创建型设计模式【简单工厂、工厂方法、抽象工厂】
  • 原文地址:https://www.cnblogs.com/isnotnull/p/15819875.html
Copyright © 2020-2023  润新知