dataworks 生成表血缘依赖
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 生成表血缘依赖相关推荐
- 根据Ibatis的SqlMap配置文件生成表结构
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 有一份应用完整的源 ...
- Flowable6.8(6.x版本通用)整合集成达梦8数据库(DM8)详解,解决自动生成表时dmn相关表语法报错问题。
Flowable集成达梦8数据库 相信大部分人都和我一样,以为只要换个数据源就可以了,起初我只更换了数据源,并开启了自动创建表功能. spring:datasource:url: jdbc:dm:// ...
- 星环TDH数据库批量生成表和存储过程
环境准备 安装python环境:解压 ,然后设置环境变量.把ETL文件夹放到本地 ETL文件夹以及脚本说明 路径D:\ETL\genproc下是各种运行的Python脚本. 路径D:\ETL\mode ...
- 表单组件 form fastadmin(生成表单元素)
Form组件 定义文件位置: /extend/fast/Formphp 通用参数 $name 通常为我们组件的名称(name属性值),我们在后台接收时可以通过这个名称来获取到它所对应的值 $value ...
- idea实体类注解生成表
1.新建工程 2.引入依赖(引入jpa) 2. 3.配置文件,更新类的时候更新表 4.新建实体类,并配置相应的注解.注解具体说明请参考以下网址(很详细,膜拜大神): http://blog.csdn. ...
- php生成表格和读取,phpexcelreader读取excel自动生成表跟字段
phpexcelreader读取excel自动生成表和字段 这个主要是采用phpexcelreader的功能实现,根据excel的文件名和excel第一行生成表名及字段,数据从第二行开始依次导入. p ...
- Entity Framework 重写OnModelCreating,控制生成表名的单复数
重写OnModelCreating,控制生成表名的单复数 public class MYDbContext : DbContext{public DbSet<User> Users { g ...
- 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构
前几天向大家介绍了一种用工具类生成数据表的方法,不过之前的方法需要使用一个跟项目关系不大的工具类.不免让人觉得有些多余,所以呢,今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...
- 一键生成表结构说明文档的参考,数据字典生成方式参考
我们经常需要出系统的表结构说明文档,需要拿给客户看,需要给同事看,需要拿给将来做系统维护的人看,编写招标文件等时还需要把一些表结果说明等,都写入到招标文件里去,虽然这些东西,我们手工都可以做,但是工作 ...
- 没有form的表单验证_PHP动态生成表单,内置17种常用组件并且支持表单验证!
FormBuilder 是一个开源的PHP表单生成器,可以快速生成现代化的form表单.还可以配合开源项目 xaboy/form-create 生成任何 Vue 组件 github | 文档 环境需求 ...
最新文章
- 编译OpenCV 2+ with CUDA 9+
- MySQL工具1:mysqladmin
- python代码编辑器下载_编程猫Python编辑器
- 低代码开发初体验一分钟——Jeecg-Boot 在线报表开发
- Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序
- 今天,Java 12 正式发布了!
- Android自定义 view之图片裁剪从设计到实现
- c语言程序设计 甘勇,C语言程序设计
- 集查询IP地址信息、查询手机号码信息、查询身份证号信息的一个小程序
- linux双网卡连不上网,linux 双网卡配置问题
- 巅峰战舰 服务器维护,《巅峰战舰》停止充值关闭服务器公告
- 这不是一篇技术型的文章,而是一篇能让你在IT世界中畅游的方法
- Error response from daemon: Container XXX is restarting, wait until the container is running
- Android Studio 依赖Moudle
- dwf怎么合成一个_油菜素内酯合成基因DWF1、DET2影响毛白杨木质部形成
- 计算机的手机储存在哪里,手机wps文件保存在哪里?
- uni.getLocation(Object)获取经纬度和当前中文地址
- apache+php配置网站访问后,不能跳转网站首页,只显示网站目录下的文件
- 水滴互助完成腾讯领投5亿元B轮融资,未来或将对标凯撒医疗...
- 调用阿里云发送短信验证码的工具类