hadoop - 解析配置单元查询时出现NoViableAltException(281 @ [])异常

标签 hadoop hive hiveql

我有要求我使用hive-exex jar中的以下类来解析hive查询
org.apache.hadoop.hive.ql.parse.ParseDriver,org.apache.hadoop.hive.ql.parse.ASTNode,org.apache.hadoop.hive.ql.parse.ParseUtils,org.apache.hadoop.hive。 ql.parse.HiveParser。

    for accessing these classes from hive-exec jar i am using following maven dependency in my project :

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>0.13.1-cdh5.3.0</version>
</dependency>

我的配置单元查询解析实用程序几乎在所有情况下都有效,但令人惊讶的是,在以下查询的情况下它失败了:

INSERT INTO db_lineage.many_one_hv SELECT * FROM(选择* FROM db_lineage.one_many1_hv UNION ALL SELECT * FROM db_lineage.one_many2_hv)FINAL;

此查询已在具有0.14和1.2版本的配置单元群集上成功执行,但是在我的本地系统中它在我的本地系统上失败。我得到的异常如下:
NoViableAltException(281 @ [])
在org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpressionBody(HiveParser.java:36959)
在org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpression(HiveParser.java:36865)
在org.apache.hadoop.hive.ql.parse.HiveParser_FromClauseParser.subQuerySource(HiveParser_FromClauseParser.java:5463)
在org.apache.hadoop.hive.ql.parse.HiveParser_FromClauseParser.fromSource(HiveParser_FromClauseParser.java:3931)
在org.apache.hadoop.hive.ql.parse.HiveParser_FromClauseParser.joinSource(HiveParser_FromClauseParser.java:1798)
在org.apache.hadoop.hive.ql.parse.HiveParser_FromClauseParser.fromClause(HiveParser_FromClauseParser.java:1456)
在org.apache.hadoop.hive.ql.parse.HiveParser.fromClause(HiveParser.java:40272)
在org.apache.hadoop.hive.ql.parse.HiveParser.singleSelectStatement(HiveParser.java:38160)
在org.apache.hadoop.hive.ql.parse.HiveParser.selectStatement(HiveParser.java:37845)
在org.apache.hadoop.hive.ql.parse.HiveParser.regularBody(HiveParser.java:37745)
在org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpressionBody(HiveParser.java:36989)
在org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpression(HiveParser.java:36865)
在org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1332)
在org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1030)
在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:199)
在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166)
在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:161)
在com.abc.bigsuite.parser.ECatHiveParser.parse(ECatHiveParser.java:39)
在com.abc.bigsuite.parser.HiveParserTest.testIssue1(HiveParserTest.java:494)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)
在java.lang.reflect.Method.invoke(未知来源)
在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)
在org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
在org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)

[ERROR] com.datametica.bigsuite.parser.ECatHiveParser-上面的查询解析中的异常
org.apache.hadoop.hive.ql.parse.ParseException:第1行:12子查询源中'('附近的'db_lineage'缺少TABLE
1:50行无法识别子查询源中'(''SELECT''*'附近的输入
在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:202)〜[hive-exec-0.13.1-cdh5.3.0.jar:0.13.1-cdh5.3.0]
在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166)〜[hive-exec-0.13.1-cdh5.3.0.jar:0.13.1-cdh5.3.0]
在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:161)〜[hive-exec-0.13.1-cdh5.3.0.jar:0.13.1-cdh5.3.0]
在com.abc.bigsuite.parser.ECatHiveParser.parse(ECatHiveParser.java:39)〜[classes /:na]
在com.abc.bigsuite.parser.HiveParserTest.testIssue1(HiveParserTest.java:494)[test-classes /:na]
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.7.0_80]
在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)〜[na:1.7.0_80]
在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)〜[na:1.7.0_80]
在java.lang.reflect.Method.invoke(未知来源)〜[na:1.7.0_80]
在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)[junit-4.12.jar:4.12]
在org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)[junit-4.12.jar:4.12]
在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)[junit-4.12.jar:4.12]

我从不连接到hive群集或任何数据库,我的实用程序是hive查询的独立解析,仅通过使用hive-exec依赖项就可以从中检索源节点和目标节点。请告诉我是否可以提供任何输入。

感谢致敬,
Mahendra Tonape。

最佳答案

Stefan,谢谢您的回答,在我的实用程序中,我从不连接到Hive数据存储区或数据库,我使用hive-exec依赖项解析hive查询并提取源表和目标表,因此无论如何我都没有检查表是否存在的问题,我通过以下方式解决了此问题:将hive-exec依赖关系升级到1.2.1,我发布的查询在hive-exec 1.2.1版本上运行良好。

关于hadoop - 解析配置单元查询时出现NoViableAltException(281 @ [])异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416048/

相关文章:

hadoop - 将普通列转换为配置单元中的分区列

function - Hive hour()函数返回NULL

hadoop - 跨 hadoop 实例移动部分数据

sql - 爆炸后如何从数组中删除一个元素

mysql - 识别和消除 hive 中的重复记录

hadoop - 如何根据连接列的条件连接配置单元表

security - Hive 中的角色分配

hadoop - 配置单元 ngram 停用词列表?

amazon-web-services - 在具有默认配置的EMR群集模式下会发生什么?

hadoop - 使用 Talend 中的 tHiveRow 组件运行多个 Hive 查询