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

    }
}
相关推荐
风跟我说过她7 小时前
SQL 一键转经典 Chen 风格 ER 图:开源 CLI + 在线工具 + Agent Skill
数据库·python·sql·开源·开源软件
兀兀术12 小时前
windows下忘记pgsql密码
sql·pgsql
熊文豪13 小时前
OceanBaseVS金仓:一条 SQL 的两条路——KingbaseES 的性能竞争力从哪来
数据库·sql·电科金仓
倔强的石头_14 小时前
让 AI 直接查公司数据库?先给 SQL 加三道闸:基于蓝耘 MaaS 的只读查询助手
sql
cspttty15 小时前
2026年财务分析岗JD中的Excel、SQL、BI与业务分析要求
大数据·sql·excel
cspttty15 小时前
HR数字化校招准备路线:Excel、SQL、BI和AI工具怎么学
人工智能·sql·excel
网络豆15 小时前
Apache Hive 鸿蒙 PC 适配全记录:以 Qt 客户端打通 HiveQL、监控与元数据访问
hive·apache·harmonyos
yuzhiboyouye1 天前
那xml对应的sql语法,列举一下
xml·数据库·sql
. . . . .1 天前
乐观锁 vs 悲观锁
数据库·sql
勤奋的树懒1 天前
从手写 SQL 到 Windows 工具:致远 OA 文件清理实践
数据库·sql·windows server·致远oa