hive语法树分析,判断 sql语句中有没有select *

pom依赖参考以下博文
java 通过 IMetaStoreClient 取 hive 元数据信息-CSDN博客

1 节点处理器类

复制代码
import lombok.Getter;
import org.apache.hadoop.hive.ql.lib.Dispatcher;
import org.apache.hadoop.hive.ql.lib.Node;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import java.util.Stack;

/**
 * 节点处理器
 */
public class SelectAllDispatcher implements Dispatcher {

    @Getter
    private boolean isContainsSelectstar = false;

    @Override
    public Object dispatch(Node node, Stack<Node> stack, Object... objects) throws SemanticException {
        //强转成 ASTNode
        ASTNode astNode = (ASTNode) node;
        if (astNode.getType() == HiveParser.TOK_ALLCOLREF) {
            isContainsSelectstar = true;
        }
        return null;
    }
    
}

2 sql语法树解析类

复制代码
import org.apache.hadoop.hive.ql.lib.DefaultGraphWalker;
import org.apache.hadoop.hive.ql.lib.Dispatcher;
import org.apache.hadoop.hive.ql.lib.GraphWalker;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.apache.hadoop.hive.ql.parse.ParseDriver;
import org.springframework.util.StringUtils;
import java.util.Collections;

public class SqlParser {

    /**
     * 遍历到每个节点时,对节点的处理。
     * 我们可以通过 自定义 Dispatcher 完成对节点的处理。
     *
     * @param dispatcher 自定义节点处理器
     * @param sql        待分析的sql
     */
    public static void sqlParse(Dispatcher dispatcher, String sql) {
        if (!StringUtils.hasText(sql)) {
            return;
        }
        try {

            // 解析 Hive SQL
            ParseDriver parseDriver = new ParseDriver(); //创建解析引擎
            //执行解析  得到根节点
            ASTNode ast = parseDriver.parse(sql);
            //  找到查询的根节点下的TOK_QUERY节点,视为有效根节点
            while (ast.getToken() == null || ast.getToken().getType() != HiveParser.TOK_QUERY) {
                ast = (ASTNode) ast.getChild(0);
            }

            // 把节点处理器注入一个图形遍历器   使用自定义处理器遍历抽象语法树
            GraphWalker ogw = new DefaultGraphWalker(dispatcher);
            // 用遍历器遍历整个语法树
            ogw.startWalking(Collections.singletonList(ast), null);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3 测试

复制代码
public class Test_12345 {
    public static void main(String[] args) {
        String sql1 = "SELECT * FROM table_name";
        String sql2 = "SELECT column1, column2 FROM table_name";
        String sql3 = "SELECT * FROM (SELECT * FROM another_table) t";
        String sql4 = "SELECT aa,bb FROM (SELECT * FROM another_table) t";
        String sql5 = "SELECT * FROM (SELECT bb FROM another_table) t";
        String sql6 = "SELECT a.* FROM table_a a JOIN table_b b ON a.id = b.id";
        String sql7 = "SELECT distinct * FROM table_a ";

        SelectAllDispatcher ggsdgsg = new SelectAllDispatcher();
        SqlParser.sqlParse(ggsdgsg,sql1);
        System.out.println("是否包括select * :" + ggsdgsg.isContainsSelectstar());

        System.out.println();

        ggsdgsg = new SelectAllDispatcher();
        SqlParser.sqlParse(ggsdgsg,sql2);
        System.out.println("是否包括select * :"  + ggsdgsg.isContainsSelectstar());

        System.out.println();

        ggsdgsg = new SelectAllDispatcher();
        SqlParser.sqlParse(ggsdgsg,sql3);
        System.out.println("是否包括select * :" + ggsdgsg.isContainsSelectstar());

        System.out.println();

        ggsdgsg = new SelectAllDispatcher();
        SqlParser.sqlParse(ggsdgsg,sql4);
        System.out.println("是否包括select * :"  + ggsdgsg.isContainsSelectstar());

        System.out.println();

        ggsdgsg = new SelectAllDispatcher();
        SqlParser.sqlParse(ggsdgsg,sql5);
        System.out.println("是否包括select * :"  + ggsdgsg.isContainsSelectstar());

        System.out.println();

        ggsdgsg = new SelectAllDispatcher();
        SqlParser.sqlParse(ggsdgsg,sql6);
        System.out.println("是否包括select * :"  + ggsdgsg.isContainsSelectstar());

        System.out.println();

        ggsdgsg = new SelectAllDispatcher();
        SqlParser.sqlParse(ggsdgsg,sql7);
        System.out.println("是否包括select * :"  + ggsdgsg.isContainsSelectstar());

    }
}
相关推荐
猫咪很可爱18 小时前
MySQL 视图与只读用户:安全查询的完整实践指南
数据库·sql·mysql
三垣网安20 小时前
某某大学心理健康教育平台弱口令及SQL注入漏洞
数据库·sql
泡海椒1 天前
JQuick-SQL “数据源 SPI”辨析:应用适配器与 Function SPI 的正确边界
数据库·驱动开发·sql
泡海椒1 天前
JQuick-SQL 逻辑数据仓库:以注册数据集构建轻量分析层
数据库·数据仓库·sql
泡海椒1 天前
JQuick-SQL JQuickTable 模型:XML 动态 SQL 的表封装边界
xml·数据库·sql
geovindu1 天前
sql:SQL Pagination and Limiting Results using PorstgreSQL 18.0
大数据·数据仓库·sql·postgresql·数据库开发·数据库架构·1024程序员节
EnCi Zheng2 天前
PostgreSQL 实战指南:安装配置、数据类型、索引选型、MVCC 事务与高可用备份全解析
数据库·sql·postgresql·索引·1024程序员节
泡海椒2 天前
JQuick-SQL REST API 数据接入:应用层调用接口后注册分析表
数据库·sql·1024程序员节
handsome_sai2 天前
mysql索引
sql·1024程序员节
莫叫石榴姐2 天前
半导体业务数仓建模: Lot、Wafer、Die、Recipe、OEE、YMS 建模要点
数据仓库·sql·面试·职场和发展·矩阵·1024程序员节