# myxql **Repository Path**: lushade/myxql ## Basic Information - **Project Name**: myxql - **Description**: 大数据血缘解析,包括spark/hive/postgreSQL/mysql等SQL表血缘和字段血缘解析及相关job解析 - **Primary Language**: Java - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 22 - **Created**: 2023-05-22 - **Last Updated**: 2023-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # myxql #### 介绍 大数据血缘解析,支持包括spark/hive/postgreSQL/mysql等常见大数据引擎,实现从SQL语句中解析表血缘关系和字段血缘解关系。同时支持从SQL作业中分解参数及提取每条SQL的血缘数据。 #### 软件架构 软件架构说明 |--------------------------------------------------------------| |SparkSQL | HiveSQL | MySQL | PostgreSQL | ... | |----------------Antlr4----------------------------------------| | 语法树解析(逻辑计划)、SQL格式化、SQL改写 | |--------------------------------------------------------------| | 血缘模型: | | 1)作业输入输出 | | 2)表、分区、属性、表上下游关系 | | 3)字段上下游关系 | |--------------------------------------------------------------| #### 路线图 1. SparkSQL表及字段血缘解析,已完成 2. 作业参数及作业输入输出表解析,已完成 3. HiveSQL表及字段血缘解析,已完成 4. Mysql表及字段血缘解析,计划中 5. PostgreSQL表及字段血缘解析,计划中 6. 暂不支持链接metastore,因此*语法暂不支持 #### 使用说明 使用时请可参考每个模块下的测试样例代码。 1. 表数据血缘 ~~~ // 创建SQL解析对象 SqlParserService parserService = new MyHiveSQLParser(); // 待解析的SQL语句 String sql = "INSERT INTO TABLE db_test.table_result SELECT t1.id, name FROM ( SELECT id1 + id2 AS id FROM db_test.table1 ) t1 LEFT JOIN ( SELECT id, name FROM ( SELECT id, sourcename AS name FROM db_test.table2 ) ) t2 ON t1.id=t2.id"; // 解析语句,返回语句血缘数据 StatementLineage statementLineage = parserService.parseSqlTableLineage(sql); // 获取语句数据 Optional statementData = statementLineage.getStatement(); // 获取语句类型 Assert.assertEquals(StatementType.INSERT_SELECT, statementLineage.getType()); statement.map(stmt -> { if (stmt instanceof TableData) { // 表数据对象 TableData tableData = (TableData) stmt; // 输入表 Assert.assertEquals(2, tableData.getInputTables().size()); // 输出表 Assert.assertEquals(1, tableData.getOutpuTables().size()); } else { Assert.fail(); } return null; }); ~~~ 2. 字段血缘 ~~~ // 创建SQL解析对象 SqlParserService parserService = new MyHiveSQLParser(); // 输入的SQL语句 String sql = "INSERT INTO TABLE db_test.table_result(idd, name) SELECT t1.id, name_x FROM ( SELECT id1 + id2 AS id FROM db_test.table1 ) t1 LEFT JOIN ( SELECT id, name_x FROM ( SELECT id, sourcename AS name_x FROM db_test.table2 ) ) t2 ON t1.id=t2.id"; // 解析字段血缘 StatementLineage statementLineage = parserService.parseSqlFieldLineage(sql); // 解析语句,返回语句血缘数据 Optional statement = statementLineage.getStatement(); // 获取语句类型 Assert.assertEquals(StatementType.INSERT_SELECT, statementLineage.getType()); statement.map(stmt -> { if (stmt instanceof TableData) { TableData tableData = (TableData) stmt; // 字段血缘数据 List columnLineageList = tableData.getColumnDatas().get(); // 字段血缘列表 Assert.assertEquals(2, columnLineageList.size()); // 字段来源 Assert.assertEquals(3, columnLineageList.get(0).getSourceFields().size()); Assert.assertEquals(1, columnLineageList.get(1).getSourceFields().size()); } else { Assert.fail(); } return null; }); ~~~ 3. 作业血缘 ~~~ // 包含参数设置及SQL语句的作业 String sql = "set spark.app.name=sparkAppName;set spark.memory.storageFraction=0.1;set spark.memory.fraction=0.95;set spark.memory.useLegacyMode=true;use testdb;select aa from d;select cc from abc;"; // 创建作业解析对象并解析作业 List statementLineages = MyJobParser.parse(sql); Assert.assertEquals(7, statementLineages.size()); // 获取作业血缘数据 StatementLineage statementData = statementLineages.get(6); Optional statement = statementData.getStatement(); // 作业类型 Assert.assertEquals(StatementType.JOB_SQL, statementData.getType()); statement.map(stmt -> { if (stmt instanceof JobSql) { // SQL作业 JobSql jobText = (JobSql) stmt; Assert.assertEquals("selectccfromabc", jobText.getSql()); } else { Assert.fail(); } return null; }); ~~~ #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)