flink_tableApi/Flink_Sql_2
table
-
实体表
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);
- 视图
- 动态表 dynamic table
- 时间特性 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!