SQL-Client 就是一个便于大家学习和写 demo 的一个 Flink-SQL 工具,这次文章的基本流程还是根据社区云邪大佬的公开课,和 官方 wiki 的步骤执行的,这里就大体自己捣鼓了一遍记录一下。
前提准备
从 GitHub 上 clone ververica/sql-training 的 Docker 镜像
地址为:https://github.com/ververica/sql-training 包含如下镜像:
执行 docker-compose up -d
加载镜像
执行 docker-compose exec sql-client ./sql-client.sh
启动 sql-client 看到松鼠就代表跑起来了!
执行 docker-compose down
终止
具体实践
执行show tables;
我们先看一下自带了这几张表
如果你想自己自定义表需要到 sql-training/build-image/training-config.yaml
下去自定义表结构,具体操作可以参照官方的文档,这次主要用到 Rides
这张表
Rides 的表结构是这样的
字段 | 类型 | 含义 |
---|---|---|
rideId | BIGINT | 行为 ID(包含两条记录,一条入一条出) |
taxiId | BIGINT | 出租车 ID |
isStart | BOOLEAN | 开始 or 结束 |
lon | FLOAT | 经度 |
lat | FLOAT | 维度 |
rideTime | TIMESTAMP | 时间 |
psgCnt | INT | 乘客数 |
这里我们顺便介绍下training-config.yaml
里的结构,sql-client 目前是提供了配置的方式定义表结构,如下:
type
:声明是一个source
还是sink
。update-mode
:表里面的数据是什么行为append
模式update
模式schema
:表结构字段的定义。- 具体介绍一下
rideTime
事件发生的时间,需要基于这个时间来做一些窗口的操作,因此要把这个字段声明为rowtime
字段添加watermark
,watermark
是Flink里的时间机制,之后的文章再做详细介绍。 connector
:主要定义连接配置,像Kafka
,Elasticsearch
等。format
:定义如何去解析定义的格式。
我们先来简单的执行一个 SQL 语句 select * from Rides;
看一下 Rides
表数据
这时候打开 http://localhost:8081/ (Flink Web)可以发现刚才的 SQL 任务已经跑起来了
同时终端也运行出了结果
需求 1(filter)
现在有这么一个需求,统计出现在纽约的行车记录。这里我们需要进行一个过滤的操作,我们需要有个自定义的 UDF ,具体思路是,表里面有经度和维度这两个字段,通过这个可以来开发一个是否在纽约的 UDF。(这里官方 Demo 里已经帮我们写好了2333)代码都在 sql-training/build-image/sql-udfs
下的IsInNYC
,继承 ScalarFunction
类实现 eval
方法。
public class IsInNYC extends ScalarFunction {
// geo boundaries of the area of NYC
private static double LON_EAST = -73.7;
private static double LON_WEST