解析HiveSql語句中的所有表名

2021-07-25 12:42:37 字數 1559 閱讀 5906

今天有個需求,解析我們hivesql語句中的表名,用來分析資料倉儲中所有表的使用頻率。

hive中有個語法分析器可以將sql語法轉換成語法樹,並且可以將語法樹轉換為字串。

例如乙個hive的sql語句如下:

select t1.c1,t1.c2,t2.c1 

from

lijie.table1 t1

left join

lijie.table2 t2

ont1.id = t2.id

where

t1.age > 20

可以解析為如下的語法樹:

(tok_query (tok_from (tok_leftouterjoin (tok_tabref (tok_tabname table1) t1) (tok_tabref (tok_tabname table2) t2) (= (. 

(tok_table_or_col t1) id) (. (tok_table_or_col t2) id)))) (tok_insert (tok_destination (tok_dir tok_tmp_file)) (tok_select (tok_selexpr (.

(tok_table_or_col t1) c1)) (tok_selexpr (. (tok_table_or_col t1) c2)) (tok_selexpr (. (tok_table_or_col t2) c1))) (tok_where (> (.

(tok_table_or_col t1) age) 20))))

解析的方法是使用hive自帶的解析器解析,我們只需要將hive中依賴的lib包匯入到工程裡即可,解析**如下:

parsedriver pd = new parsedriver();

string ps= "select t1.c1,t1.c2,t2.c1 from table1 t1 left

join table2 t2 on

t1.id = t2.id where t1.age > 20

";astnode ast = pd.parse(ps);

string strtree = ast.tostringtree();

system.out.println(strtree);

根據解析出來的語法樹字串中的規律可以發現表名都是在「tok_tabname」和」)」之間,最後可以使用乙個自定義方法遞迴解析出裡面的表名(其中list是成員變數):

/**

* 遞迴擷取字串獲取表名

*@param strtree

*@return

*/public

static listgettablelist(string strtree)

return list;

}

測試上面hive sql的解析結果:

Shell語句中if的所有引數詳解

shell中if語句的所有引數詳解 a file 如果file存在則為真 不過貌似有時候 a表示為and 條件與 b file 如果file存在且是乙個塊特殊檔案則為真 c file 如果file存在且是乙個字特殊檔案則為真 d file 如果file檔案存在且是乙個目錄則為真 d前的 是邏輯非 例...

for語句中的 和

for int i 0 i 100 i 和for int i 0 i 100 i 是程式設計中常用的兩個語句,這兩個語句看似作用類似但實際上在使用中卻容易產生很多意想不到的問題 入下例 這段 是用歸併排序演算法對陣列進行排序,在merge函式中有三個for語句,如果使用 和使用 會嘗試完全不同的結果...

Sql語句中的DDL語句

資料庫模式定義語言ddl data definition language 是用於描述資料庫中要儲存的現實世界實體的語言。主要由create 新增 alter 修改 drop 刪除 和 truncate 刪除 四個關鍵字完成。create database 資料庫名 建立乙個資料庫 create d...