FlinkSQL

Doit -FlinkSQL

Flink SQL。

**核心工作原理**:
	将源数据 流 数据集 绑定元数据schema后 注册成catalog 中的表。table view。
	然后用户通过tableAPI 或SQL表达计算逻辑。
	table-planner对SQL语义 绑定元数据得到逻辑执行计划。
	再用Optimizer 优化后 得到物理执行计划。
	物理执行计划经过代码生成器生成代码 得到Transformation Tree
	Transformation Tree 转成JobGraph 提交到 flink 集群执行。

Node{
name.
age
parent Node 含有父亲引用
}
常量折叠。 谓词下推。投影下推。基于规则 的优化:
基于代价成本的优化。-物理计划优化。
算子 有自己对应的代码模版。

动态表 和Changelog 流

动态表:
核心抽象 是无界的数据流:
changeMode 模式 -U -I -D
AppendOnly Stream. Retract Stream Upsert Stream
Row 类型 可以装任何东西。
Row代表一行。rowKind 表示。changeMode类型。
table-api-java-bridge 依赖添加。
持续计算 持续输出。
+I -D -U +U
Flink-SQL编程:
创建编程入口。
将数据源定义成表 视图。 映射成表。
执行SQL语义的查询 sql语法或者table-api
将查询结果输出到目标表。
fromTableDescriptor~。
流表 混合编程。
环境创建 先创建流 在创建表环境
表的标识结构:
catalog name. db name. table name
数据源标识。
view 基于表 创建 代表一个或多个表的计算逻辑。
临时 与永久:
默认是在内存catalog中。不同的Session之间互相 不可见。 同一个Session 重启之后也发生了变化。

Table 对象各种创建方式:

	1. Table 对象获取 方式解析:
从已经注册的表
从Table Descriptor。连接器 /format/shema/option
从DataStream
从Table 对象上的查询API生成
从测试数据。

tableEnv.fromDataStream~. 可以传入Schema 。
把流中的。数据转换为JavaBean 可以识别Schema 表结构。
fromValues:
做测试 用 DataTypes 传入 类型。
拿到表对象。或者表 名称。 view 依托于 物理数据上。dataStream/view

Catalog 理解:

内存元数据Catalog GenericInMemoryCatalog
catalog 存在 一个LinkedHashMap中。

临时表放在 一个额外的 TemporaryTables 里面。额外的hashMap。不在任何一个Catalog中 而在Catalog Manager的一个HashMap中。
同名的表。 优先选 临时空间中的 表路径相同。

写入Kafka流 如果有Upsert的操作需要用Upsert Kafka 。 需要指定主键。-U被吞掉 不会在屏幕显示。

三种类型的字段 定义

physical column
computed columns 表达式字段。
metadata columns
元数据信息: 相关的Topic 分区号 偏移量 Headers leaderEpoch 命令行输入的没有Key
Connector 会暴露一部分元数据的信息。可以通过字段形式得到。

普通Kafka 连接器 不支持定义主键Key。 Upsert-Kafka 支持主键 changelog流。
Descriptor ————>>>> columnByMetaData column columnByExpression

format 概述。
Json形式
filesystem: source 里面不支持 元数据。1.14 不支持 1.15 支持。

结构体中取字段。xxxx.XX
嵌套Json中取值 xxx[‘xx’] 类似Struct 。
array index 是从1 开始 。

csv format:
Flink-SQL 时间属性。Watermark
bigInt 类型 不允许定义为事件时间属性。 必须是 timestamp 或者timestamp_ltz 类型。
如果是bigInt类型 需要用TO_TIMESTAMP(numeric , precision)先转为 timestamp 形式。
✳️。‼️。 字段声明为 事件时间属性。根据这个属性产生WaterMark

流转表 时 无论源流是否定义了WaterMark 都不会自动传递WM。如需进行时间运算。需要转换定义中显式声明WM策略。
可以新生成。也可以沿用原来的WM

表转流
WaterMark 会自动传入进来。

Kafka 连接器:
P140
 Key 和value 中有相同的数据时:
 	最细的kafka。建表:
  tenv.executeSql(
                " CREATE TABLE t_kafka_connector (                       "
                        + "     guid   int,                                        "
                        + "     eventId string,                                    "
                        + "     eventTime bigint,                                  "
                        + "     pageId    string,                                  "
                        + "     k1        int,                                     "
                        + "     k2        int,                                     "
                        + " 	rec_ts   timestamp(3) metadata from 'timestamp' ,  "
                        + " 	`offset` bigint metadata ,                         "
                        + " 	headers map<string,bytes> metadata,                "
                        + " 	rt as to_timestamp_ltz(eventTime,3) ,              "
                        + " 	watermark for rt as rt - interval '0.001' second   "
                        + " ) WITH (                                               "
                        + "  'connector' = 'kafka',                                "
                        + "  'topic' = 'doit30-kafka',                             "
                        + "  'properties.bootstrap.servers' = 'doitedu:9092',      "
                        + "  'properties.group.id' = 'testGroup',                  "
                        + "  'scan.startup.mode' = 'earliest-offset',           "
                        + "  'key.format'='json',                               "
                        + "  'key.json.ignore-parse-errors' = 'true',           "
                        + "  'key.fields'='k1;k2',                              "
                        /* + "  'key.fields-prefix'='',                   "     */
                        + "  'value.format'='json',                             "
                        + "  'value.json.fail-on-missing-field'='false',        "
                        + "  'value.fields-include' = 'EXCEPT_KEY'              "
                        + " )                                                   "

        );
Upsert -Kafka

-U 没有写入Kafka中。只写入+U
group by只会产生 -U +U 和+I

-D 在Join中 体现。

  • D在 Kafka中 的体现是一个Null。 看见Null之后再往下面读一行。
JDBC 连接器

1> 可以作为Scan Source 底层产生Bounded Stream
2> 可以作为lookUpSource 底层事件驱动 式查询
3> 可以作为Batch模式 下的 Sink
4> 可以作为Stream 模式下的append Sink 和Upsert Sink
处理方式:
永远插入 把-U 吞掉。 利用 insert on duplicate key 更新。
Scan 模式不会持续读取。
需要表中定义主键 才可以进行。Upsert 操作。

FileSystem Connector

数据库文件 不存在format 文件需要添 format
分区字段 需要是 表定义中的字段 与Hive 不同 Hive 分区的字段不可以出现在表定义的字段中。

tenv.executeSql(
                "CREATE TABLE fs_table (\n" +
                        "  user_id STRING,\n" +
                        "  order_amount DOUBLE,\n" +
                        "  dt STRING,\n" +
                        "  `hour` STRING\n" +
                        ") PARTITIONED BY (dt, `hour`) WITH (\n" +
                        "  'connector'='filesystem',\n" +
                        "  'path'='file:///d:/filetable/',\n" +
                        "  'format'='json',\n" +
                        "  'sink.partition-commit.delay'='1 h',\n" +
                        "  'sink.partition-commit.policy.kind'='success-file',\n" +
                        "  'sink.rolling-policy.file-size' = '8M',\n" +
                        "  'sink.rolling-policy.rollover-interval'='30 min',\n" +
                        "  'sink.rolling-policy.check-interval'='10 second'\n" +
                        ")"
        );
flink-sql 建表完整语法
CDC 连接器

需要。添加ckpt 结合 changelog 流。

flink-sql-cdc 连接器 动态变化表复杂逻辑测试。
UPDATE_BEFORE -U
UPDATE_AFTER. +U

复杂逻辑 在flink-sql里面做 会有不支持的情况。

Flink -sql 查询: – P156

多维高阶聚合语法。

withRollUp~
flink中:

group by cube
group by groupingsets() 组合~。
group by rollUp()

时间窗口计算 TVF。 函数。
Window Table Value Function。函数产生一个表。TVF 内置window Start windowEnd 。
滚动: tumble
滑动 HOP。
Flink -SQL 中没有会话窗口

累积窗口: cumulate. 截止当前。 window start 不变 window最大长度。
单独的表值函数不支持。必须和 group by 聚合一起。
表值函数的约束:::
1.在窗口上做分组聚合。必须带上window_start 和wondow_end
2.窗口上做TopN计算 也必须带上 ~
3. Join 条件必须带上~。两个表的window_start 和window_end 等值条件。

表值函数 TopN~
窗口Join
常规Join:
Regular Join: 没有窗口的Join。 设置状态TTL 使状态 量不至于过大。 背压风险。

lookUp Join:
左表。
右表是维表。mysql表。 只支持 处理时间 语义来输出。
lookUp。 缓存是否开启?
单流 点查。

Interval Join

曝光 流和播放流。interval join 。

temporal Join 时态Join
左边数据 总是Join 右边数据的 那一时刻的 最新版本
汇率变化。
over 聚合:
Flink-SQL 支持rows between 和range between

函数

自定义函数------>>>>

Scalar 函数。
标量 单行函数。
继承scalar function。实现。eval 方法~/
分组聚合函数:
Aggregate function:
继承Aggregate Function~。
实现 create Accumulator。 accumulate。 getValue 方法。

Java 中重载 是参数列表 不同 而不是返回值区分。

table function:

表生成函数
需要加注解 @FuntionHint

table aggregate function:

表聚合函数:
分组 TopN~。
定义几个。值 one two 。。。
table api中。flatAggregate 方法。

sql-client 的使用:
flink 整合Hive:
	sql-client
	只能写 纯sql。流表 互转不可以。 需要依赖Jar包。
metric 基本度量

监控指标。

prometheus。 grafana
node manager。push gateway===Flink 。
企业级监控套装

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值