Flink sql 预览 执行结果

基于flink 1.9.1 扩展

场景

公司基于flink sql 二次开发了etl 功能。
其中有一个场景是要根据输入,实时预览sql执行后的结果。
比如有这样一条sql

select cast(order_id as bigint),
          str_to_timestamp('2017-11-01 23:59:55','yyyy-MM-dd HH:mm:ss'),
          false, 
          is_exist('order_id'),
          to_base64('hello'),
          ['3','4'],
         __baas__all__ 
        from order_source   

说明:

  1. order_source是 kafka中流表
  2. [‘3’,‘4’] 是我扩展flink sql后定义数组的方式,对应原生Array[‘3’,‘4’]
  3. 输出的数据同样返回到kafka中

实现方案

  1. 本地启动flink,实际执行
  2. 解析sql,自己实现
  3. 获取所有operator,执行

第一种方式 开销太大,即使是以local模式启动也不能接受
第二种方式 与flink sql内部实现不一致,到时候数据输出也会不一致

我当时想如果能够在一个方法中过一遍flink 的operator就好了,这样免除了启动flink 各种组件的开销,又能保持数据一致。说做就做

设计与实现如下

  1. flink 内部使用calcite 解析sql,生成ast,然后validate->optimatize。优化后的语法树,就用经典的火山模型老一套,生成Transformations,也就是DAG。
        Planner planner = tableEnv.getPlanner();
        StreamPlanner streamPlanner = (StreamPlanner) planner;

        //反射获取private 字段
        List<ModifyOperation> bufferedModifyOperations = BeanUtil.getField(TableEnvironmentImpl.class, tableEnv, "bufferedModifyOperations");
        List<Transformation<?>> translate = streamPlanner.translate(bufferedModifyOperations);

flink内部做了一些转换,我们调用tableEnv.sqlQuery 的时候,生成Operation缓存起来,exec

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值