使用Druid解析SQL实现血缘关系计算
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.util.JdbcConstants;
import lombok.extern.slf4j.Slf4j; import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects; @Slf4j
public class Test { public static void main(String args[]) throws Exception { String sql = "insert overwrite table kf_zt.account2 SELECT swjg_dm,swjgmc FROM (SELECT swjg_dm AS swjg_dm, swjgmc AS swjgmc FROM (SELECT swjg_dm,swjgmc FROM ( SELECT swjg_dm,swjgmc FROM yuangongs) table_350 UNION SELECT swjg_dm,swjgmc FROM (SELECT swjg_dm2,swjgmc2 FROM yuangong ) table_295) union_013) udf_882"; List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql.toLowerCase(), JdbcConstants.HIVE); for (SQLStatement sqlStatement : sqlStatements) {
SchemaStatVisitor schemaStatVisitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.HIVE);
sqlStatement.accept(schemaStatVisitor);
Map<TableStat.Name, TableStat> tables = schemaStatVisitor.getTables();
Collection<TableStat.Column> columns = schemaStatVisitor.getColumns();
if (Objects.nonNull(tables)) {
tables.forEach(((name, tableStat) -> {
if (tableStat.getCreateCount() > 0 || tableStat.getInsertCount() > 0) {
log.info("to: table[{}]", name.getName().toLowerCase());
columns.stream().filter(column -> Objects.equals(column.getTable().toLowerCase(), name.getName().toLowerCase())).forEach(column -> {
log.info("to: table[{}] column[{}]", column.getTable().toLowerCase(), column.getName().toLowerCase());
});
} else if (tableStat.getSelectCount() > 0) {
log.info("from: table[{}]", name.getName().toLowerCase());
columns.stream().filter(column -> Objects.equals(column.getTable().toLowerCase(), name.getName().toLowerCase())).forEach(column -> {
log.info("from: table[{}] column[{}]", column.getTable().toLowerCase(), column.getName().toLowerCase());
});
}
}));
}
}
} }
使用Druid解析SQL实现血缘关系计算的更多相关文章
- saas架构之druid解析表名
public void preHandle(BoundSql boundSql, RequestEntity requestEntity) { System.out.println("要执行 ...
- 基于spark logicplan的表血缘关系解析实现
随着公司平台用户数量与表数量的不断增多,各种表之间的数据流向也变得更加复杂,特别是某个任务中会对源表读取并进行一系列复杂的变换后又生成新的数据表,因此需要一套表血缘关系解析机制能清晰地解析出每个任务所 ...
- 利用 druid 解析器解析SQL
最近参与一个开源项目,一个功能的实现,用到了 druid 解析器来解析SQL,记录下如果使用 druid 来解析SQL,实现对SQL的拦截改写. 1. 对 insert 语句进行解析: private ...
- 利用 druid 的 sql parser 模块解析 sql 语句
druid 是阿里开源在 github 上面的数据库连接池,里面有一个专门解析 sql 语句的模块 源码位置: https://github.com/alibaba/druid SQL Parse ...
- 基于MaxCompute InformationSchema进行血缘关系分析
一.需求场景分析 在实际的数据平台运营管理过程中,数据表的规模往往随着更多业务数据的接入以及数据应用的建设而逐渐增长到非常大的规模,数据管理人员往往希望能够利用元数据的分析来更好地掌握不同数据表的血缘 ...
- 血缘关系分析工具SQLFLOW--实践指南
SQLFlow 是用于追溯数据血缘关系的工具,它自诞生以来以帮助成千上万的工程师即用户解决了困扰许久的数据血缘梳理工作. 数据库中视图(View)的数据来自表(Table)或其他视图,视图中字段(Co ...
- 深入解析SQL Server并行执行原理及实践(上)
在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而Postgre ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- SpringMVC4+MyBatis+SQL Server2014+druid 监控SQL运行情况
前言 在基于SpringMVC+MyBatis的开发过程中,我们希望能看到自己手写SQL的执行情况,在开发阶段我们可以配置log4j在控制台里基于debug模式查看,那么上线后,在生产声我们想查看SQ ...
- Apache-Flink深度解析-SQL概览
你可能感兴趣的文章: Flink入门 Flink DataSet&DataSteam API Flink集群部署 Flink重启策略 Flink分布式缓存 Flink重启策略 Flink中的T ...
随机推荐
- pyqt5学习日记
前提需要pip安装PyQt5与PyQt5-tools 安装后会有qtdesigner.exe和pyuic5.exe,用everything直接可以搜索到 qtdesigner.exe是来设计ui的 p ...
- Linux 内核设备驱动程序的IO寄存器访问 (下)
Linux 内核设备驱动程序通过 devm_regmap_init_mmio() 等函数获得 struct regmap 结构对象,该对象包含可用于访问设备寄存器的全部信息,包括定义访问操作如何执行的 ...
- 如何调用API接口获取商品数据
在当今数字化的时代,电子商务的崛起使得网购成为了人们生活中不可或缺的一部分.作为电子商务中最为熟知和流行的平台之一,拥有大量的商品资源和用户群体.如果你是一名开发者或者是对数据分析感兴趣的人,你可能会 ...
- OptiX8入门(一)optixHello
本人初学者,如有错误和更好的表述,请指出 环境:CLion+VS2022+CUDA Toolkit 12.0.1+OptiX8 下载好后打开SDK就可以看到OptiX官方提供的许多例子,CMake配置 ...
- 在 RedHat Enterprise、CentOS 或 Fedora Linux 上安装 MongoDB
在 RedHat Enterprise.CentOS 或 Fedora Linux 上安装 MongoDB 1.大纲 备注:采用yum安装后,所有进程将自动在/usr/bin下,如下的mongo.mo ...
- iframe子窗口调用父窗口方法
//一个iframe页面调用另一个iframe页面的方法self.parent.frames["sort_bottom"].mapp($("#id").val( ...
- SQL取上一条, 下一条记录方法
如果我们需要取id为3的前后的1条记录. 就可以用以下方法 取上一条记录: select * from `表名` where `id`<3 order by `id` desc limit ...
- Flutter 编写收音机开源
之前写的一个 Flutter 收音机,支持桌面端和手机端,在https://www.cnblogs.com/imlgc/p/17536481.html ,写完之后就不怎么管了.后面陆陆续续有人邮件索要 ...
- jenkins更换国内插件源
sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' ...
- Pisces.IM.Mood 前言
关于 Pisces.IM.Mood Mood Pisces.IM.Mood 一款基于TCP协议的即时通讯开源系统 多个客户端目前支持以下功能: 支持文字,图片,文件,emoji表情的发送 文件限制为5 ...