FlinkSql(三)代码中的注意点

1.数据类型与 Table schema 的对应

DataStream 中的数据类型,与表的 Schema 之间的对应关系,是按照样例类中的字段名来对应的(name-based mapping),所以还可以用 as 做重命名。

另外一种对应方式是,直接按照字段的位置来对应(position-based mapping),对应的过程中,就可以直接指定新的字段名了。

基于名称的对应:

val sensorTable = tableEnv.fromDataStream(dataStream, 'timestamp as 'ts, 'id
as 'myId, 'temperature)

基于位置的对应:

val sensorTable = tableEnv.fromDataStream(dataStream, 'myId, 'ts)

Flink DataStream DataSet API 支持多种类型。

组合类型,比如元组(内置 Scala Java 元组)、POJOScala case 类和 Flink Row 类型等,允许具有多个字段的嵌套数据结构,这些字段可以在 Table 的表达式中访问。其他类型,则被视为原子类型。

元组类型和原子类型,一般用位置对应会好一些;如果非要用名称对应,也是可以的:元组类型,默认的名称是 “_1”, “_2”;而原子类型,默认名称是 ”f0”

2.创建临时视图(Temporary View)

创建临时视图的第一种方式,就是直接从 DataStream 转换而来。同样,可以直接对应字段转换;也可以在转换的时候,指定相应的字段。

tableEnv.createTemporaryView("sensorView", dataStream)
tableEnv.createTemporaryView("sensorView", dataStream, 'id, 'temperature,'timestamp as 'ts)

 另外,当然还可以基于 Table 创建视图:

tableEnv.createTemporaryView("sensorView", sensorTable)

3.模式

在流处理过程中,表的处理并不像传统定义的那样简单。

对于流式查询(Streaming Queries),需要声明如何在(动态)表和外部连接器之间执行转换。与外部系统交换的消息类型,由更新模式update mode)指定。

Flink Table API 中的更新模式有以下三种:

3.1 追加模式(Append Mode)

在追加模式下,表(动态表)和外部连接器只交换插入(Insert)消息。

3.2 撤回模式(Retract Mode)

在撤回模式下,表和外部连接器交换的是:添加(Add)和撤回(Retract)消息。

  • 插入(Insert)会被编码为添加消息;
  • 删除(Delete)则编码为撤回消息;
  • 更新(Update)则会编码为,已更新行(上一行)的撤回消息,和更新行(新行)的添加消息。

在此模式下,不能定义 key,这一点跟 upsert 模式完全不同。

3.3 Upsert(更新插入)模式

Upsert 模式下,动态表和外部连接器交换 Upsert Delete 消息。这个模式需要一个唯一的 key,通过这个 key 可以传递更新消息。为了正确应用消息,外部连接器需要知道这个唯一 key 的属性。

  • 插入(Insert)和更新(Update)都被编码为 Upsert 消息;
  • 删除(Delete)编码为 Delete 信息。

这种模式和 Retract 模式的主要区别在于,Update 操作是用单个消息编码的,所以效率会更高

 4.将表转换成 DataStream

表可以转换为 DataStream DataSet。这样,自定义流处理或批处理程序就可以继续在Table API SQL 查询的结果上运行了。

将表转换为 DataStream DataSet 时,需要指定生成的数据类型,即要将表的每一行转换成的数据类型。通常,最方便的转换类型就是 Row。当然,因为结果的所有字段类型都是明确的,我们也经常会用元组类型来表示。

表作为流式查询的结果,是动态更新的。所以,将这种动态查询转换成的数据流,同样需要对表的更新操作进行编码,进而有不同的转换模式。

Table API 中表到 DataStream 有两种模式:

  • 追加模式(Append Mode)

用于表只会被插入(Insert)操作更改的场景。

  • 撤回模式(Retract Mode)

用于任何场景。有些类似于更新模式中 Retract 模式,它只有 Insert Delete 两类操作。得到的数据会增加一个 Boolean 类型的标识位(返回的第一个字段),用它来表示到底是新增的数据(Insert),还是被删除的数据(老数据, Delete)。

val resultStream: DataStream[Row] = tableEnv.toAppendStream[Row](resultTable)
val aggResultStream: DataStream[(Boolean, (String, Long))] = 
tableEnv.toRetractStream[(String, Long)](aggResultTable)
resultStream.print("result")
aggResultStream.print("aggResult")

 

 所以,没有经过 groupby 之类聚合操作,可以直接用 toAppendStream 来转换;而如果经过了聚合,有更新操作,一般就必须用 toRetractDstream

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值