封面图片

编程

数据开发平台数据加工流程的设计方案

在开发数据平台时,往往有这么一个功能,通过拖拉拽配置数据加工DAG,然后根据流程图生成数据开发任务,一般情况下这个任务就是SQL。本篇不涉及具体代码,只提供一个解决思路。


在使用过,或者了解,甚至开发过数据平台的人都会知道每个平台都会有这么一个通过拖拉拽配置数据加工流程图的功能。这个功能应该是系统的核心功能,做的好不好直接影响数据开发平台的使用。这个功能要做好有几个难点需要解决,第一个是前端拖拉拽组件的选择;第二个是后台如何处理前端的数据,生成数据处理SQL,同时保证拓展性好。

功能截图如下所示:

https://ppsummer.com/blog/preview/FC61E1F0WX20230413-141923@2x.png

生成SQL预览:

https://ppsummer.com/blog/preview/9ECC66B5WX20230413-113601@2x.png

数据加工DAG组件

数据加工DAG组件使用的蚂蚁数据可视化框架AntV的X6。使用X6的Graph的组件,在此基础上新增交互编辑功能。每个node就是一个处理逻辑。比如数据输入源、过滤、转换、去重、下沉、TopN等。每个节点应该有一个唯一ID,可以根据节点类型和序号组成。通过配置每个算子的逻辑来生成数据加工的SQL。最终目的是要简化手写SQL或者不写SQL的程度。

生成SQL

构造树结构

后台拿到前端传过来的数据,包含node、edge的信息。通过edge的信息来确定node的先后关系。根据这个关系来构造树结构,树结构的每个叶子节点就是对应的DAG图的节点,DAG图的关系对应树的结构关系。

代码层面上构建一个Node工厂类,根据Node类型和其他参数来生成实际的Node节点。定义一个Node父类,包含生成SQL的抽象方法,Node的类型属性,由子类自己实现。Node子类比如数据源Node类,过滤Node类等等。当需要添加新的加工算子的时候,后台只需要增加一个Node子类去实现相关的生成SQL的逻辑就可以。主体逻辑代码是无需更改的。

如何生成SQL

如何拼装成一个完整的可执行,可拓展的SQL是问题的关键。最开始就是通过嵌套来做,使用各种子查询,发现这个不仅拼装逻辑非常复杂,节点越多,复杂度成倍增加,而且容易出错。后来发现可以通过With as短语。

WITH AS短语,也叫做子查询部分(subquery factoring),是用来定义一个SQL片断,该SQL片断会被整个SQL语句所用到。这个语句算是公用表表达式(CTE)。

通过使用With as短语,整个sql拼装逻辑就非常简单了。只需要按照顺序拼装每个Node类型生成的with as查询语句。其中with后面跟着的别名可以使用node ID。当然这个方案只对支持with as语法的引擎有效,比如Hive。

Node工厂模式、继承Node抽象类配合With AS短语正好可以实现新增节点的拓展需求。

最后

开始撸代码(GET START)!

2023年04月13日

更多文章

在初学者眼中,世界充满了可能;专家眼中,世界大都已经既定。--铃木俊隆