项目场景:
编程获得数据血缘关系的需求对数据仓库来说并不普遍,只有数据规模达到很大的程度,或者存在复杂数据生产关系的报表数量增加到很大的程度,单独的数据血缘关系工作才有必要。
在规模没达到之前,人工的识别和管理是更经济有效的。
antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。 antlr有 v2 v3 v4多个版本并存,中文文档多数是v2的, hive 1.1.0版本在注释中提到了antlr 3.4。ANTLR将上述结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的语法分析规则。然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。
使用ANTLR3.5.2版本解析Hivesql的源代码grammar文件中的HiveLexer.g,将代码:
@lexer::header { package org.apache.hadoop.hive.ql.parse import org.apache.hadoop.conf.Configuration import org.apache.hadoop.hive.conf.HiveConf } @lexer::members { private Configuration hiveConf public void setHiveConf(Configuration hiveConf) { this.hiveConf = hiveConf } protected boolean allowQuotedId() { if(hiveConf == null){ return false } String supportedQIds = HiveConf.getVar(hiveConf, HiveConf.ConfVars.HIVE_QUOTEDID_SUPPORT) return !"none".equals(supportedQIds) } }
这段需要注释,以便借用ANTLR编译过后的JAVA不带有该包。
问题描述
将这一段使用/** */注释掉之后,还是编译,发现报错:
[10:58:10] error(100): HiveLexer.g:42:1: syntax error: antlr: NoViableAltException(9@[]) [10:58:10] error(100): HiveLexer.g:42:2: syntax error: antlr: NoViableAltException(49@[]) [10:58:10] error(100): HiveLexer.g:42:7: syntax error: antlr: MissingTokenException(inserted [@-1,0:0='<missing ACTION>',<4>,42:6] at :) [10:58:10] error(100): HiveLexer.g:42:8: syntax error: antlr: NoViableAltException(22@[]) [10:58:10] error(100): HiveLexer.g:42:9: syntax error: antlr: NoViableAltException(80@[]) [10:58:10] error(100): HiveLexer.g:42:9: syntax error: antlr: NoViableAltException(80@[]) [10:58:10] error(100): HiveLexer.g:47:1: syntax error: antlr: MissingTokenException(inserted [@-1,0:0='<missing SEMI>',<82>,47:0] at KW_TRUE)
原因分析:
查询资料发现
注释中’;'作为终止符,产生错误
踩坑指南:大叔经验分享(78)hive查询报错NoViableAltException - 匠人先生 - 博客园
hive split 分隔分号问题_小亚文的博客-CSDN博客_\073 分隔符
hive 报错NoViableAltException_丶大白菜的博客-CSDN博客_noviablealtexception
解决方案:
把原注释文档全删除或者将其中的;给删掉。
问题解决。