解析HiveSql语句中的所有表名

今天有个需求,解析我们hivesql语句中的表名,用来分析数据仓库中所有表的使用频率。

hive中有个语法分析器可以将sql语法转换成语法树,并且可以将语法树转换为字符串。

例如一个hive的sql语句如下:

select t1.c1,t1.c2,t2.c1 
from 
lijie.table1 t1
left join 
lijie.table2 t2
on
t1.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)))) <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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值