解析HiveSql语句中的所有表名
来源:互联网 发布:两列数据查找相同项 编辑:程序博客网 时间:2024/05/18 18:04
今天有个需求,解析我们hivesql语句中的表名,用来分析数据仓库中所有表的使用频率。
hive中有个语法分析器可以将sql语法转换成语法树,并且可以将语法树转换为字符串。
例如一个hive的sql语句如下:
select t1.c1,t1.c2,t2.c1 from lijie.table1 t1left join lijie.table2 t2ont1.id = t2.idwhere 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)))) <EOF>
解析的方法是使用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 List<String> getTableList(String strTree){ int i1 = strTree.indexOf("TOK_TABNAME"); String substring1 = ""; String substring2 = ""; if(i1>0){ substring1 = strTree.substring(i1+12); int i2 = substring1.indexOf(")"); substring2 = substring1.substring(0,i2); System.out.println(substring2); list.add(substring2); getTableList(substring1); } return list; }
测试上面hive sql的解析结果:
0 0
- 解析HiveSql语句中的所有表名
- SQL Server中获取所有数据库名、所有表名、所有字段名的SQL语句
- HiveSql语句(1)
- oracle中怎么用SQL语句获取指定数据库中的所有表名
- HiveSQL解析过程详解
- HiveSQL解析过程详解
- HiveSQL解析过程详解
- HiveSQL解析过程详解
- HiveSQL解析过程详解
- HiveSQL解析过程详解
- 查找某一个数据库中的所有表名
- 获取不同数据库中的所有表名
- SQLserver读取库中的所有表名
- 显示表中的所有字段名
- 得到Access数据库中的所有表名
- 获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
- [轉]获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
- Sql Server查看所有数据库名,表名,字段名(SQL语句)
- 坚守本心
- title
- BZOJ 3812: 主旋律【状压dp+容斥
- 强化学习资料
- title
- 解析HiveSql语句中的所有表名
- [leetcode javascript解题]Letter Combinations of a Phone Number
- RPL多跳组网
- Selector--状态选择器
- leetcode_461. Hamming Distance 计算汉明距离,按位异或运算,计算整数的二进制表示中1的个数 java
- 数据结构——学期总结
- 查看oracle的统计信息
- 基于SLIP协议节点与计算机组网
- 2016年年终CSDN博客总结