1.背景:

工作中用到了阿里云的dataworks,业务需求还没有到购买更高级的版本必要,没法查看表的血缘依赖。需要自己去实现血缘依赖。

思路: maxcompute 提供Information_Schema元数据查询,可以其中TASKS_HISTORY 表,可以查询到任务执行的日志, sql任务对应的执行sql 放在了operation_text,存在执行的sql,可以通过自定义函数解析sql生成表的血缘关系,这里需要用到阿里的druid,来解析sql语法。

实现过程:

1.maxcompute 自定义函数sql_parse

这里我是使用java的方式实现,需要引入的依赖,,

<dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version>
</dependency>

实现逻辑是,传入sql 代码片段,通过druid进行解析,会返回 这里返回的是个字符串拼接的结果,为啥没返回json呢,json在sql炸裂的时候不是很方便,  最终结果返回格式为

来源表->结果表,来源表->结果表

实现代码如下,


public class SqlParse extends UDF {/**** @param sql* @return*/public String evaluate(String sql) {List<SQLStatement> stmts = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS);List<String> tableRelation = new ArrayList<>();for (SQLStatement stmt : stmts) {stmt.accept(statVisitor);Map<TableStat.Name, TableStat> tables = statVisitor.getTables();if (tables != null) {String value = null;List<String> tableList = new ArrayList<>();for (Map.Entry<TableStat.Name, TableStat> nameTableStatEntry : tables.entrySet()) {TableStat stat = nameTableStatEntry.getValue();String name = nameTableStatEntry.getKey().getName();if (stat.getCreateCount() > 0 || stat.getInsertCount() > 0) {value = name;} else if (stat.getSelectCount() > 0) {tableList.add(name);}}if (StringUtils.isNotBlank(value)) {for (String table : tableList) {tableRelation.add(table + "->" + value);}}}}return tableRelation.isEmpty() ? null : String.join(",", tableRelation);}}

2,上传jar,进行函数注册,参考官方文档

MaxCompute UDF概述 - 云原生大数据计算服务 MaxCompute - 阿里云

3.编写sql,提取表依赖

这里的逻辑不一定符合每个人的业务逻辑,可以自己对应结果,是否满足,做出对应调整。

-- use project_name; -- 对应的项目名称
select split(table_relation_value,"->")[0] source_table,split(table_relation_value,"->")[1] sink_table,1 as value  from (select REPLACE(sql_parse(nvl(operation_text,'')),"project_name.",'')  as  table_relation from  Information_Schema.TASKS_HISTORY where ds='${bizdate}'and   task_type in ("SQL","SQLRT")  and sql_parse(nvl(operation_text,''))  is not null
)t1
lateral view explode(split(t1.table_relation,",")) b as   table_relation_value
where  table_relation_value not  REGEXP 'tmp_dwd_print_industry_keyword|tmp_dim_print_user_industry_relation|Information_Schema.TASKS_HISTORY'
group by source_table,sink_table

tip: 如果每个sql任务,只会对应一个结果表,可以直接用input_tables,和output_tables,不用进行sql解析。

实现过程这期间我查看了很多别人的方案,还是觉得druid比较好,它本身就支持maxcompute 的语法。以下是我找到的druid的相关文档

介绍 - 《Alibaba Druid v1.0 使用手册》 - 书栈网 · BookStack

推荐一个做到比较好的在线血缘依赖网站:https://sqlflow.gudusoft.com/#/

dataworks 生成表血缘依赖相关推荐

  1. 根据Ibatis的SqlMap配置文件生成表结构

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 有一份应用完整的源 ...

  2. Flowable6.8(6.x版本通用)整合集成达梦8数据库(DM8)详解,解决自动生成表时dmn相关表语法报错问题。

    Flowable集成达梦8数据库 相信大部分人都和我一样,以为只要换个数据源就可以了,起初我只更换了数据源,并开启了自动创建表功能. spring:datasource:url: jdbc:dm:// ...

  3. 星环TDH数据库批量生成表和存储过程

    环境准备 安装python环境:解压 ,然后设置环境变量.把ETL文件夹放到本地 ETL文件夹以及脚本说明 路径D:\ETL\genproc下是各种运行的Python脚本. 路径D:\ETL\mode ...

  4. 表单组件 form fastadmin(生成表单元素)

    Form组件 定义文件位置: /extend/fast/Formphp 通用参数 $name 通常为我们组件的名称(name属性值),我们在后台接收时可以通过这个名称来获取到它所对应的值 $value ...

  5. idea实体类注解生成表

    1.新建工程 2.引入依赖(引入jpa) 2. 3.配置文件,更新类的时候更新表 4.新建实体类,并配置相应的注解.注解具体说明请参考以下网址(很详细,膜拜大神): http://blog.csdn. ...

  6. php生成表格和读取,phpexcelreader读取excel自动生成表跟字段

    phpexcelreader读取excel自动生成表和字段 这个主要是采用phpexcelreader的功能实现,根据excel的文件名和excel第一行生成表名及字段,数据从第二行开始依次导入. p ...

  7. Entity Framework 重写OnModelCreating,控制生成表名的单复数

    重写OnModelCreating,控制生成表名的单复数 public class MYDbContext : DbContext{public DbSet<User> Users { g ...

  8. 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构

    前几天向大家介绍了一种用工具类生成数据表的方法,不过之前的方法需要使用一个跟项目关系不大的工具类.不免让人觉得有些多余,所以呢,今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...

  9. 一键生成表结构说明文档的参考,数据字典生成方式参考

    我们经常需要出系统的表结构说明文档,需要拿给客户看,需要给同事看,需要拿给将来做系统维护的人看,编写招标文件等时还需要把一些表结果说明等,都写入到招标文件里去,虽然这些东西,我们手工都可以做,但是工作 ...

  10. 没有form的表单验证_PHP动态生成表单,内置17种常用组件并且支持表单验证!

    FormBuilder 是一个开源的PHP表单生成器,可以快速生成现代化的form表单.还可以配合开源项目 xaboy/form-create 生成任何 Vue 组件 github | 文档 环境需求 ...

最新文章

  1. 编译OpenCV 2+ with CUDA 9+
  2. MySQL工具1:mysqladmin
  3. python代码编辑器下载_编程猫Python编辑器
  4. 低代码开发初体验一分钟——Jeecg-Boot 在线报表开发
  5. Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序
  6. 今天,Java 12 正式发布了!
  7. Android自定义 view之图片裁剪从设计到实现
  8. c语言程序设计 甘勇,C语言程序设计
  9. 集查询IP地址信息、查询手机号码信息、查询身份证号信息的一个小程序
  10. linux双网卡连不上网,linux 双网卡配置问题
  11. 巅峰战舰 服务器维护,《巅峰战舰》停止充值关闭服务器公告
  12. 这不是一篇技术型的文章,而是一篇能让你在IT世界中畅游的方法
  13. Error response from daemon: Container XXX is restarting, wait until the container is running
  14. Android Studio 依赖Moudle
  15. dwf怎么合成一个_油菜素内酯合成基因DWF1、DET2影响毛白杨木质部形成
  16. 计算机的手机储存在哪里,手机wps文件保存在哪里?
  17. uni.getLocation(Object)获取经纬度和当前中文地址
  18. apache+php配置网站访问后,不能跳转网站首页,只显示网站目录下的文件
  19. 水滴互助完成腾讯领投5亿元B轮融资,未来或将对标凯撒医疗...
  20. 调用阿里云发送短信验证码的工具类

热门文章

  1. 用Asp.net 就能轻松实现铁道部的订票系统
  2. 程序化交易系统的搭建
  3. Android学习笔记--菜单
  4. 搜狐股票接口获取数据方法
  5. 可爱猫python_可爱猫微信机器人框架最新版以及使用教程
  6. Python练手项目:计算机自动还原魔方视频
  7. 计算机网络总结篇-我们是怎么访问百度的?
  8. 电脑桌面只显示计算机不显示文件夹,如何解决电脑桌面不显示拷贝文件的问题?...
  9. 【DP之家】Ubuntu简介
  10. 基于STM32:情侣互动玩偶(设计方案+源码+3D图纸+AD电路)