前言
为了找到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;
}
}
没有评论