Flink1.12新特性
SQL Connectors 中的 Metadata 处理
Flink 1.12 中,元数据列是 SQL 标准的扩展,参数中connector和format配置提供的metadata字段。元数据列由METADATA
关键字指示。例如,元数据列可用于在 Kafka 记录中读取和写入时间戳,以进行基于时间的操作。连接器和格式文档列出了每个组件的可用元数据字段。但是,在表的架构中声明元数据列是可选的。
//sql CREATE TABLE source( field1 varchar, field2 int, ts TIMESTAMP(3) METADATA FROM'timestamp', partition
BIGINT METADATA, offset
BIGINT METADATA, proc_time AS PROCTIME() )WITH( 'properties.bootstrap.servers'='110.42.146.82:9092', 'connector'='kafka-x', 'scan.parallelism'='1', 'format'='json', 'topic'='planet_MetaData', 'scan.startup.mode'='latest-offset' ); CREATE TABLE sink_kafka( field1 varchar, field2 int, ts timestamp, partition
bigint, offset
bigint )WITH( 'properties.bootstrap.servers'='110.42.146.82:9092', 'connector'='kafka-x', 'format'='json', 'topic'='planetTest', 'sink.parallelism'='1' ); create table sink( field1 varchar, field2 int, ts timestamp, partition
bigint, offset
bigint )with( 'connector'='stream-x', 'print'='true' ); insert intosink select field1, field2, ts, partition
, offset
from source; insert into sink_kafka select field1, field2, ts, partition
, offset
from source;
~
上述案例中 Kafka connector available metadata
时态表
Flink1.12中,一张随时间变化的表即可被称为时态表,时态表是一个概念解释,并没有实体。
时态表可以被分为两个实体概念,根据有无ChangeLog来区分定义。
版本表: 如果时态表中的记录可以追踪和并访问它的历史版本,这种表我们称之为版本表,来自数据库的 changelog 可以定义成版本表。
普通表: 如果时态表中的记录仅仅可以追踪并和它的最新版本,这种表我们称之为普通表,来自数据库 或 HBase 的表可以定义成普通表。
声明版本表
在 Flink1.12 中,定义了主键约束(1)和事件时间属性(2)的表就是版本表。
-- 定义一张版本表
CREATE TABLE product_changelog (
product_id STRING,
product_name STRING,
product_price DECIMAL(10, 4),
update_time TIMESTAMP(3) METADATA FROM 'value.source.timestamp' VIRTUAL,
PRIMARY KEY(product_id) NOT ENFORCED, -- (1) 定义主键约束
WATERMARK FOR update_time AS update_time -- (2) 通过 watermark 定义事件时间
) WITH (
'connector' = 'kafka-x',
'topic' = 'products',
'scan.startup.mode' = 'earliest-offset',
'properties.bootstrap.servers' = 'localhost:9092',
'format' = 'debezium-json' -- 时态表限定debezium-json
);
声明版本视图
Flink1.12还支持讲Append-Only流转成changlog流。 先声明一个Append-Only表
-- 定义一张 append-only 表
CREATE TABLE RatesHistory (
currency_time TIMESTAMP(3),
currency STRING,
rate DECIMAL(38, 10),
WATERMARK FOR currency_time AS currency_time -- 定义事件时间
) WITH (
'connector' = 'kafka',