基于元数据方式 SQL 开发

可能对于熟悉 DDL 开发任务的同学来说 会有下面几个问题:

  1. 怎么没有地方配我的数据源和数据输出,那我怎么知道我从哪里读,写到哪里去了?
  2. 我的数据表怎么在 SQL 中表示,包括数据源头,数据输出,维表 JOIN 用到的表,怎么用 SQL 唯一定位到
  3. SQL 语法是怎么样的,我该怎么实现一个维表 JOIN?
  4. SQL 是怎么调试的? 还是像老版本一样,需要拉个 print 组件吗?
  5. 输出怎么输出,是写 Insert Into 的标准语法,还是可以用老版本的可配置的方式?

其实这几个问题,也就是我们开发元数据任务的一个流程顺序,那么针对上面几个比较头痛的问题,我们来依次解答一下:

  1. 怎么配置数据源和输出

    在对接元数据中心后,我们将所有的数据源,数据输出,维表 join 都进行了统一的管理,不在单独放置在任务里,一方面为了减少数据源重复配置,降低人为修改配置的风险,另一方面 为了后续如数据源切换,权限控制,血缘追踪考虑;

    那么在哪里配置呢, 所有的数据输入,输出,维表的连接信息,都是在 Easystream 数仓界面配置 如下图:

    数仓-数据源管理

    具体的配置方法请参考 数仓管理 章节。

    如果是数据输出和维表 JOIN 用到的数据源,只需要在数据源登记就可以了,但是如果是数据源头的话,还需要在数仓管理里面初始化一张流表。

  2. 如何唯一定位数据表

    经过第一步配置数据源,我们已经可以在 SQL 中可以直接访问我们的数据源了,但是我不知道怎么去在 SQL 中表达。在元数据 SQL 中,我们统一采用 [CATALOG].[DB].[TABLE] 来定位一张表。如果这张表是源头的流表,也就是在 Easystream 元数据管理界面创建的表, 可以直接用[DB].[TABLE]的形式访问,Easystream 为每个产品默认生成一个默认 catalog,用户可以忽略 。

    catalog 其实就是刚才你注册的数据源的名称,对于在 Easystream 元数据管理界面登记的表,注册的流表的 catalog 统一 Easystream 生成的默认catalog;

    db 分三种情况

    数据源(source):如果是输入数据源的话,那么 db 代表的应该是在 Easystream 数仓管理-> 元数据管理界面,创建表时候所在的库,比如 test,这个就是一个库名。具体在 SQL 语句中如何使用数据源,请参考 Source 章节。

    数据输出:如果是输出数据源的话,对于一般的 sink,我们是用 mem 来表示 db,jdbc 可能略微不同,具体详情请参考 Sink 章节。

    维表 JOIN:如果是维表 JOIN,请参考 维表JOIN 章节。

    table 分三种情况

    数据源头:如果是输入数据源的话,那么 db 代表的应该是在Easystream 数仓管理-> 元数据管理界面,创建表的名字。具体在 SQL 语句中如何使用数据源,请参考 Source 章节。

    数据输出:如果是输出数据源的话,对于 jdbc,可能就是你真实数据库里的表名,对于 redis,可能就是你的操作方式,如 INCR,具体详情请参考 Sink 章节。

    维表JOIN:如果是维表 JOIN,请参考 维表JOIN 章节。

  3. SQL 语法是怎样的?我该怎么实现一个维表 JOIN 呢?

    在 Flink 1.10 中,我们和社区一致,除去不支持 DDL 语句,其他的与官方都是一致的。如果是之前开发过离线的同学,这里的 SQL 的差别应该不大,都是标准的 ANSI SQL,具体的 SQL 语法请参考 SQL 语法 章节。

    对于维表JOIN的语法,与以前稍微有改动,请参考 维表JOIN 章节。

  4. SQL 怎么调试呢?

    与 DDL 任务的调试一样。在点击 调试 菜单的弹窗里上传对应的source/dim 的测试数据,然后点击 调试 就可以进行任务调试了。

  5. 怎么输出呢?

    SQL 式,用 Insert into 语句,将数据插入到相应的表中。

    对于每种 SINK,SQL 怎么写,配置怎么配,请大家参考 Sink 章节。

  6. 如何配置 watermark?

    请参考 Watermark 章节。

这里是针对大家入门会遇到的一个 gap 进行了科普,如果大家有好的建议,也欢迎反馈给我们,及时订正文档。