前言

为了找到insert的表是否依赖自己本身。然后去监测累计全量表分区的大小是否一直在涨。

代码

/**
 * 从SQL内获取SQL是全量表的表名
 * @author liuchenhong
 * @date 2022/10/12 10:33
 */
public class TestGetTableColumnNew {
    public static void main(String args[]) throws IOException {
        // 获取文件,每行为sql语句
        String sqlPathName = "/Users/jls/Working/sparksql-result-jieguo_new101122.txt"; // 绝对路径或相对路径都可以,这里是绝对路径,写入文件时演示相对路径
        File filename = new File(sqlPathName);
        InputStreamReader reader = new InputStreamReader(
                new FileInputStream(filename)); // 建立一个输入流对象reader
        BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言
        String line = "";
        //所有全量表集合
       Set<String> totalTablesSet = new HashSet<>();
        while (line != null) {
            line = br.readLine();
            if(line==null){break;}
            String totalTable= isTotalTable(line);
            if(!totalTable.equals("")){
                System.out.println(totalTable);
                totalTablesSet.add(totalTable);
            }
        }
       //输出全量表集合
     for (String totalTable : totalTablesSet) {
            System.out.println(totalTable);
        }

    }

    /**
     * 判断SQL是否是全量表插入的SQL 如果是返回表名  如果不是返回空字符串
     * 判断方法: inserttable 有值 且 inserttable = selecttable
     * @param sql sql语句
     * @return  表名
     */
    public static String isTotalTable(String sql){
        String totalTable = "";
        TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvhive);
        sqlparser.sqltext  = SqlFormatter.format(
                sql);
        int ret = sqlparser.parse();
        if (ret == 0){
            TInsertSqlStatement insert = null;
            for (int i = 0; i < sqlparser.sqlstatements.size(); i++) {
                if (sqlparser.sqlstatements.get(i) instanceof TInsertSqlStatement) {
                    insert = (TInsertSqlStatement) sqlparser.sqlstatements.get(i);
                    break;
                }}
            if (insert !=null) {
                TObjectName target = insert.getTargetTable().getTableName();
                String insertTable = target.getObjectToken().astext.toLowerCase();
                TSelectSqlStatement select = insert.getSubQuery();
                Set<String> selectTables = getTables(select, null);
                for (String selectTable : selectTables) {
                    if (selectTable.contains(".")) {
                        String[] split = selectTable.split("\\.");
                        if (split.length == 2) {
                            selectTable = split[1].replaceAll("`", "").trim();
                        }
                    }
                    if (selectTable.toLowerCase().equals(insertTable)) {
                        totalTable = selectTable.toLowerCase();
                    }
                }
            }

        }else{
            System.out.println(sqlparser.getErrormessage());
        }
        return totalTable;
    }

    /**
     * * 获取查询SQL语句中的表名
     * @param select    查询语句
     * @param selectTables 查询语句中的表名
     * @return  查询语句中的表名
     */
    public static Set<String> getTables(TSelectSqlStatement select, Set selectTables){
        if(selectTables==null){
            selectTables=new HashSet();
        }
        if(select.getSetOperatorType().equals(ESetOperatorType.union)) {
            TSelectSqlStatement leftselect =select.getLeftStmt();
            TSelectSqlStatement rightselect =select.getRightStmt();
            getTables(leftselect, selectTables);
            getTables(rightselect, selectTables);
        }else {
            TTableList tables = select.getTables();
            for (int i = 0; i < tables.size(); i++) {
                TSelectSqlStatement se = tables.getTable(i).getSubquery();
                if (se != null) {
                    if (se.getSetOperatorType().equals(ESetOperatorType.union)) {
                        TSelectSqlStatement leftselect = se.getLeftStmt();
                        TSelectSqlStatement rightselect = se.getRightStmt();
                        getTables(leftselect, selectTables);
                        getTables(rightselect, selectTables);
                    } else {
                        getTables(se, selectTables);
                    }
                    getTables(se, selectTables);
                } else {
                    selectTables.add(tables.getTable(i).toString());

                }
            }
        }
        return selectTables;
    }
}