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

    }
}


 

相关推荐

  1. hive语法分析判断 sql语句select *

    2024-03-22 05:16:06       23 阅读
  2. 【Golang】switch 语句select 语句什么区别?

    2024-03-22 05:16:06       18 阅读
  3. SQL SELECT DISTINCT 语句

    2024-03-22 05:16:06       39 阅读
  4. SQL SELECT 语句

    2024-03-22 05:16:06       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-22 05:16:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-22 05:16:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-22 05:16:06       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-22 05:16:06       20 阅读

热门阅读

  1. Hive自定义GenericUDTF函数官网示例

    2024-03-22 05:16:06       17 阅读
  2. PhpSpreadsheet 读取 excel 里面的图片

    2024-03-22 05:16:06       16 阅读
  3. Docker学习笔记 - 使用配置脚本来启动image

    2024-03-22 05:16:06       18 阅读
  4. [蓝桥杯 2015 省 B] 生命之树

    2024-03-22 05:16:06       21 阅读
  5. python内置函数 O

    2024-03-22 05:16:06       18 阅读
  6. Linux-find命令

    2024-03-22 05:16:06       18 阅读
  7. MySQL 将null值替换成0

    2024-03-22 05:16:06       16 阅读
  8. uniapp中使用mixins控制横屏竖屏

    2024-03-22 05:16:06       17 阅读
  9. 微信授权登录获取用户openid

    2024-03-22 05:16:06       17 阅读