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());

    }
}
相关推荐
IvorySQL3 小时前
济南站活动回顾|IvorySQL中的Oracle XML函数使用示例及技术实现原理
xml·数据库·sql·postgresql·oracle·开源
Data 3173 小时前
Hive数仓操作(十)
大数据·数据库·数据仓库·hive·hadoop
ON.LIN3 小时前
Hadoop大数据入门——Hive-SQL语法大全
大数据·数据库·hive·hadoop·分布式·sql
好好学习的人4 小时前
SQL第12课——联结表
数据库·sql
逸巽散人16 小时前
SQL基础教程
数据库·sql·oracle
月空MoonSky16 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
Mephisto.java17 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
Data 31718 小时前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop
-seventy-19 小时前
SQL语句 (MySQL)
sql·mysql
coderWangbuer1 天前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql