大数据场景下,每天可能都要在离线集群,运行大量的任务来支持产品、运营的分析查询。任务越来越多的时候,就会有越来越多的依赖关系,每一个任务都需要等需要的input表生产出来后,再去生产自己的output表。最开始的时候,依赖关系自然是可以通过管理员来管理,随着任务量的加大,就需要一个分析工具来解析SQL的血缘关系,并且自行依赖上血缘表。

本文就介绍一个使用druid parser,来解析SQL的血缘关系。

一、SQL血缘关系含义

SQL血缘关系的含义是将sql中包含的表全部输出。

例:如下sql,需要解析出该sql包含supindb.student、supindb.college两张表。

String sql = "select * from " +

"(select * from supindb.student d where dt='20190202')a " +

"left join " +

"(select * from supindb.college c where dt='20190202')b " +

" on a.uid=b.uid " +

"where a.uid > 0";

二、SQL血缘关系解析实现

SQL血缘关系解析pom依赖

com.alibaba

druid

1.0.14

SQL血缘关系解析代码

SQL血缘关系解析代码仅解析select、update、insert、delete四种sql,其他种类,可依据需求自行添加相应逻辑。

public class Parent {

public static Map> getFromTo (String sql) throws ParserException {

Map> result = new HashMap>();

List stmts = SQLUtils.parseStatements(sql, JdbcConstants.HIVE);

TreeSet selectSet = new TreeSet();

TreeSet updateSet = new TreeSet();

TreeSet insertSet = new TreeSet();

TreeSet deleteSet = new TreeSet();

if (stmts == null) {

return null;

}

String database = "DEFAULT";

for (SQLStatement stmt : stmts) {

SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(stmts,JdbcConstants.HIVE);

if (stmt instanceof SQLUseStatement) {

database = ((SQLUseStatement) stmt).getDatabase().getSimpleName();

}

stmt.accept(statVisitor);

Map tables = statVisitor.getTables();

if (tables != null) {

final String db = database;

for (Map.Entry table : tables.entrySet()) {

TableStat.Name tableName = table.getKey();

TableStat stat = table.getValue();

if (stat.getCreateCount() > 0 || stat.getInsertCount() > 0) { //create

String insert = tableName.getName();

if (!insert.contains("."))

insert = db + "." + insert;

insertSet.add(insert);

} else if (stat.getSelectCount() > 0) { //select

String select = tableName.getName();

if (!select.contains("."))

select = db + "." + select;

selectSet.add(select);

}else if (stat.getUpdateCount() > 0 ) { //update

String update = tableName.getName();

if (!update.contains("."))

update = db + "." + update;

updateSet.add(update);

}else if (stat.getDeleteCount() > 0) { //delete

String delete = tableName.getName();

if (!delete.contains("."))

delete = db + "." + delete;

deleteSet.add(delete);

}

}

}

}

result.put("select",selectSet);

result.put("insert",insertSet);

result.put("update",updateSet);

result.put("delete",deleteSet);

return result;

}

public static void main(String[] args) {

String sql = "select * from " +

"(select * from supindb.student d where dt='20190202')a " +

"left join " +

"(select * from supindb.college c where dt='20190202')b " +

" on a.uid=b.uid " +

"where a.uid > 0";

//sql = "update supindb.college set uid='22333' where name='小明'";

//sql = "delete from supindb.college where uid= '22223333'";

Map> getfrom = getFromTo(sql);

for (Map.Entry> entry : getfrom.entrySet()){

System.out.println("================");

System.out.println("key=" + entry.getKey());

for (String table : entry.getValue()){

System.out.println(table);

}

}

}

}

运行结果

image.png

python解析sql字段血缘_SQL血缘关系分析相关推荐

  1. 推荐两则基于解析SQL的表间血缘关系工具

    推荐两则基于解析SQL的表间血缘关系工具 基于大数据脚本,可以用Apache Atlas做元数据的血缘关系分析,很多金融机构仍然在使用老的遗留系统,比如老版本的Hive.数据库存储过程,如何反查表间的 ...

  2. Python程序中各函数间调用关系分析与可视化

    中国大学MOOC"Python程序设计基础"免费学习地址 2020年秋季学期Python教材推荐与选用参考 推荐图书: <Python程序设计(第3版)>,(ISBN: ...

  3. 通过Python做葡萄酒成分与质量的关系分析并可视化--GBDT/随机森林特征选取

    葡萄酒成分与质量关系分析 -- 通过GBDT以及Random Forests进行特征选取 在UCI下载葡萄酒数据集,链接:https://archive.ics.uci.edu/ml/machine- ...

  4. 解析SQL的表间血缘关系工具

    一.sqllineage SQL Lineage Analysis Tool powered by Python 源码地址:https://github.com/reata/sqllineage 安装 ...

  5. python解析sql文件_如何从Python中解析sql文件?

    是否有任何方法可以从Python中执行.SQL文件中的某些SQL命令,而不是文件中的所有SQL命令?假设我有以下.sql文件:DROP TABLE IF EXISTS `tableA`; CREATE ...

  6. python解析sql语句表名_python正则表达式匹配sql语句中的表名

    [ string text = "select * from [admin] where aa=1 and cc='b' order by aa desc "; Regex reg ...

  7. python pymongo+networkx 实现mongo数据血缘关系可视化

    为什么80%的码农都做不了架构师?>>>    数据血缘通常是指数据产生的链路,其采集主要通过自动解析(存储过程.SQL.ETL过程等文件)结合人工收集的方式实现.本文不涉及数据血缘 ...

  8. 【SQL】血缘解析 SQL parser 工具介绍

    1.概述 2. git 大数据解析:https://github.com/0xqq/bigdata-sql-parser 基于hook机制实现数据血缘系统 [Flink]第三十二篇:Flink SQL ...

  9. 基于MaxCompute InformationSchema进行血缘关系分析

    一.需求场景分析 在实际的数据平台运营管理过程中,数据表的规模往往随着更多业务数据的接入以及数据应用的建设而逐渐增长到非常大的规模,数据管理人员往往希望能够利用元数据的分析来更好地掌握不同数据表的血缘 ...

  10. 【勉强采用】反欺诈之血缘关系分析和犯罪传导监测

    文前小故事:隔壁阿姨最近总是带个包鬼鬼祟祟地出去,妈妈好奇,今天跑过去串门,问她最近在忙什么,她一下就忍不住哭了起来:我被人骗了--好多人去要钱--我把我姐和我女儿也坑了--那是我姐夫的安葬费--还有 ...

最新文章

  1. 开源大数据周刊-第44期
  2. 分享懒人张RDLC报表(四)
  3. HashSet集合介绍
  4. HTTPS下导出excel失败解决办法
  5. 首页列表显示全部问答,完成问答详情页布局
  6. java 在一个类中定义类_Java 中程序代码必须在一个类中定义,类使用( )关键字来定义。_学小易找答案...
  7. mysql 存储时间 时间戳_具体场景下MySQL中用“时间戳”存储时间的问题
  8. index mysql_mysql 原理~ index的详解
  9. html引用ttf字体文件
  10. 11、生成带参数二维码应用场景
  11. 中国自动上弦手表市场趋势报告、技术动态创新及市场预测
  12. ecshop模板支持php,解决ecshop模板不支持php代码,修改ecshop过滤模板php代码!
  13. JSON字符串中带有反斜杠
  14. 世嘉土星系统memory mapping システムの使用するメモリのマッピングについて
  15. 微信为什么使用 SQLite 保存聊天记录
  16. 网络硬盘 excel服务器,Excel Server Tutorial
  17. 离线环境遇到Problems loading reference..Unable to load schema from https-解决篇
  18. HTTP中常见的各种状态码详解及解决方案
  19. css鼠标拖拉卡顿_浅谈CSS3 动画卡顿解决方案
  20. 数控计算机实习小结,大学生数控机床实习心得体会

热门文章

  1. java引用类型内存_Java的引用类型的内存分析
  2. Linux常用磁盘管理命令详解
  3. 又是一年深秋时--西湖枫叶随拍
  4. css练习-小米官网首页静态页面制作
  5. Let's talk OOP Again
  6. 面试题七 C/C++ 骑士营救公主 骑士只能向右或者向下移动,遇到陷阱就死了,求骑士营救公主的所有路线-程序员面试题
  7. 企业邮箱邮件的服务器地址是什么?企业邮箱服务器出错怎么办?
  8. 西班牙、阿根廷和委内瑞拉的五所大学提供加密货币课程
  9. 学年总结(2015-2016学年回顾)
  10. react中使用构建缓存_如何使用React,GraphQL和Okta构建健康跟踪应用