目标
系列第二篇里利用了HiveParser.g里的pushMsg输出信息,但还没有得到AST(Abstract Syntax Tree抽象语法树 ),不够实用。除了得到AST之外,第二篇末尾还需要解决下面这3个实用性问题
- token的大小写问题, Hive里select 和SELECT都能接受
- 分号问题,也就是必须能解析一个字符串里包含多个sql语句的情况
- 解析规则,类似insert-select这种hive里接受,但HiveParser.g文件里没有定义的情况
本篇先说清楚如何解决得到AST的问题,然后解决insert-select的实用性
得到AST
上一篇的代码其实已经走到了临门一脚。作为解析入口的parser.statement()这个方法是有返回值的,默认生成的返回类型是自动生成的一个类, HiveParser.statement_return, AST 就藏在这个类里,可以通过这个类的getTree(),得到一个类型为CommonTree 的对象。用python代码拿到这个CommonTree的代码如下
import jnius_config
jnius_config.set_classpath('./','./grammar/hive110/antlr-3.4-complete.jar')
import jnius
StringStream = jnius.autoclass('org.antlr.runtime.ANTLRStringStream')
Lexer = jnius.autoclass('grammar.hive110.HiveLexer')
Parser = jnius.autoclass('grammar.hive110.HiveParser')
TokenStream = jnius.

该博客讲述了如何通过ANTLR和Python解析Hive SQL,以获取AST并解决实际问题,如token大小写、多SQL语句解析和insert-select的处理。作者提供了从AST获取表名和列名的方法,并指出了在处理insert-select时的错误及其修正方式。
最低0.47元/天 解锁文章
273

被折叠的 条评论
为什么被折叠?



