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