hive中sql解析出對應表和字段的調查


---恢復內容開始---

1.阿里的druid中的sql parser有各種關系數據庫sql的解析,但hive的不支持。

druid初期的版本中是包含hive的,將以前版本中的hive dialect對應的內容放入,測試,發現有些語句不支持,如:
show create table xxx;
show tables;
普通的select語句是可以解析的,如:
sql:select STATIS_DATE, INTFC_TP, TRMNL_TP_ID, APP_VERSION, CLNT_CHNL, BRAND_CATE_ID, BRAND_CATE_NM, BRAND_ID, BRAND_NM, CATENTRY_GROUP_ID, CATENTRY_GROUP_NM, GDS_ID, CATENTRY_ID, CATENTRY_NM, UV_QTY, PV_QTY, 0 NEW_UV_QTY, SEARCH_CNT, SHOPNG_CART_PV_QTY, PAGE_DRTN, 0 EXIT_QTY, ORDER_PAY_QTY, ORDER_PAY_AMNT, ORDER_PAY_SALE_QTY, ORDER_DLVRY_PAY_QTY, ORDER_DLVRY_PAY_AMNT, ORDER_DLVRY_PAY_SALE_QTY, ETL_TIME from mobdss.tdm_trmnl_cate_stat_d t where t.statis_date >= regexp_replace(date_sub(from_unixtime(to_unix_timestamp('20150505', 'yyyyMMdd'), 'yyyy-MM-dd'), 6), '-', '') and t.statis_date <= 20150505
結果:{mobdss.tdm_trmnl_cate_stat_d=Select}
[mobdss.tdm_trmnl_cate_stat_d.STATIS_DATE, mobdss.tdm_trmnl_cate_stat_d.INTFC_TP, mobdss.tdm_trmnl_cate_stat_d.TRMNL_TP_ID, mobdss.tdm_trmnl_cate_stat_d.APP_VERSION, mobdss.tdm_trmnl_cate_stat_d.CLNT_CHNL, mobdss.tdm_trmnl_cate_stat_d.BRAND_CATE_ID, mobdss.tdm_trmnl_cate_stat_d.BRAND_CATE_NM, mobdss.tdm_trmnl_cate_stat_d.BRAND_ID, mobdss.tdm_trmnl_cate_stat_d.BRAND_NM, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_GROUP_ID, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_GROUP_NM, mobdss.tdm_trmnl_cate_stat_d.GDS_ID, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_ID, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_NM, mobdss.tdm_trmnl_cate_stat_d.UV_QTY, mobdss.tdm_trmnl_cate_stat_d.PV_QTY, mobdss.tdm_trmnl_cate_stat_d.SEARCH_CNT, mobdss.tdm_trmnl_cate_stat_d.SHOPNG_CART_PV_QTY, mobdss.tdm_trmnl_cate_stat_d.PAGE_DRTN, mobdss.tdm_trmnl_cate_stat_d.ORDER_PAY_QTY, mobdss.tdm_trmnl_cate_stat_d.ORDER_PAY_AMNT, mobdss.tdm_trmnl_cate_stat_d.ORDER_PAY_SALE_QTY, mobdss.tdm_trmnl_cate_stat_d.ORDER_DLVRY_PAY_QTY, mobdss.tdm_trmnl_cate_stat_d.ORDER_DLVRY_PAY_AMNT, mobdss.tdm_trmnl_cate_stat_d.ORDER_DLVRY_PAY_SALE_QTY, mobdss.tdm_trmnl_cate_stat_d.ETL_TIME]


2.General sql parser中有hive sql的對應解析,但是商業版且自己不可控,不打算用。
參照:http://107.170.101.241:8080/getTableColumn/

3.antlr的使用,文法文件,語法文件定義,然后運行解析生成AST。
參照:http://www.ibm.com/developerworks/cn/java/j-lo-antlr/,定義了一個基本的+-運算的Expr.g。
自定義hive文法文件去解析幾乎不可能實現。
到hive中的文發文件進行解析,不如直接通過調用hive的parse方法,拿到語法樹。


4.從hive的ParseDriver中獲取語法樹,直接解析得到table和column,但沒有可用的visitor進行遍歷語法樹進行獲取。
遍歷ast,通過hive既有的方法或者自定義遍歷器得到對應的解析

Hive的ParseDriver類中,通過antlr生成的語法樹AST。
例子:Select name,ip from zpc where age > 10 and area in (select area from city)

(TOK_QUERY 
(TOK_FROM 
(TOK_TABREF 
(TOK_TABNAME zpc)
)
) 
(TOK_INSERT 
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) 
(TOK_SELECT 
(TOK_SELEXPR (TOK_TABLE_OR_COL name)) (TOK_SELEXPR (TOK_TABLE_OR_COL ip))
) 
(TOK_WHERE 
(and 
(> (TOK_TABLE_OR_COL age) 10) 
(TOK_SUBQUERY_EXPR (TOK_SUBQUERY_OP in) 
(TOK_QUERY 
(TOK_FROM 
(TOK_TABREF 
(TOK_TABNAME city)
)
) 
(TOK_INSERT 
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) 
(TOK_SELECT 
(TOK_SELEXPR (TOK_TABLE_OR_COL area))
)
)
) 
(TOK_TABLE_OR_COL area)
)
)
)
)
)

注:1.TOK_INSERT個節點是在語法改寫中特意 增加了的一個節點。原因是Hive中所有查詢的數據均會保存在HDFS臨時的文件中,無論是中間的子查詢還是查詢最終的結果,Insert語句最終會將數 據寫入表所在的HDFS目錄下。
2.每個表生成一個TOK_TABREF節點。

目標:可以遍歷AST,獲取到table和table對應的列名。
另外可以從mysql中獲取table的列及類型對應信息。(調用desc table即可)。
調用hive樹的遍歷:((SemanticAnalyzer) sem).doPhase1(ast, qb, null);
QBParseInfo info = qb.getParseInfo();
QBParseInfo中可以獲取表名,分區名,列名,別名等信息。
判斷QB的屬性和方法后,覺得QB中的信息並不是想要的信息。

結論:自定義遍歷器,來遍歷AST樹中的表名。遍歷器的實現其實也很簡單,深度遍歷,判斷對應的token節點獲取相應的值。

 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM