栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

sql血缘分析(元数据 Hive血缘关系(解析SQL构建血缘图))

sql血缘分析(元数据 Hive血缘关系(解析SQL构建血缘图))

数据中台,数据仓库在大数据的发展中占着重要的占比,二者两者都离不开血缘关系的构建,解析SQL构建血缘关系

SQL的解析可以分为三个步骤: 【一】获取最外层表的个数(判断是否是Union关系)

    我们可以借助工具查询最外层表的个数,一般的来源都是一个或多个,如果 是Union关系,那么就是0个,这样来处理Union的关系

log.debug("表个数: {}", stmt.getTables().size());
if (stmt.getTables().size() >= 1) {
    // TODO 处理非Union的逻辑关系

} else {
    // Union的逻辑可以拆分为 left和right
    TSelectSqlStatement leftStmt = stmt.getLeftStmt();
    if (Func.notNull(leftStmt)) {
        parseStatement(leftStmt, null, pojoList, targetTable);
    }

    TSelectSqlStatement rightStmt = stmt.getRightStmt();
    if (Func.notNull(rightStmt)) {
        parseStatement(rightStmt, null, pojoList, targetTable);
    }
}
【二】判断该SQL是否包含子查询(临时表)

    如果最外层的SQL包子查询(临时表),那么就需要把子查询视为一个整体,先构建目标表到临时表之间的血缘关系。
    借助工具,我们可以判断表类型,如果表类型是subquery,那么可以明确知道是子查询,那么就可以将其视为一个 新的表,递归处理

if (table.getTableType() == ETableSource.subquery) {
   TSelectSqlStatement statement = table.getSubquery();
   if (Func.notNull(statement)) {
       parseStatement(statement, null, pojoList, table.getAliasName());
   }
}
【三】接下来就可以把表的查询字段进行解析

    借助工具我们可以获取到所查询(操作)的字段,字段的那些大致分为三类,普通字段(可以直接使用) ,case when语句,Hive函数

switch (expressionType) {
    case case_t:
        // TODO case when查理
        break;
    case function_t:
        // TODO 函数处理,cast比较特殊
        break;
    case arithmetic_plus_t:
    case parenthesis_t:
    case arithmetic_modulo_t:
    case logical_and_t:
    case arithmetic_times_t:
    case arithmetic_divide_t:
    case simple_comparison_t:
    case array_access_expr_t:
        // TODO 以上存在多对一 , 那么需要把两个字段分开,分别获取 每个字段的信息
        break;
    case simple_object_name_t:
        // TODO 直接获取字段的信息
        break;
    default:
        break;
}
End 我们只需要将获取的字段信息记录到MySQL中,那么使用递归查询,即可构建血缘的关系

附上血缘图Json

    {
        "edges": [
            {
                "from": {
                    "column": "name",
                    "tbName": "data2"

                },
                "to": {
                    "column": "name",
                    "tbName": "middle1"
                }

            },
            {
            ...
            }
        ],
        "nodes": [
        	{
                "id": "data1",
                "name": "data1",
                "type": "Origin",
                "columns": [{
                    "name": "age"
                }, {
                    "name": "name"
                }, {
                    "name": "class"
                }],
                "top": 135,
                "left": 10
            },{
            	...
            }
        ]
    }

以上是解析HQL的思路,更多的是借助工具,如果有需要可以下面留言

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/771403.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号