【发布时间】:2016-05-26 18:10:53
【问题描述】:
我需要使用 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>
我的 hive 查询解析实用程序几乎适用于所有情况,但令人惊讶的是它在以下查询的情况下会失败:
INSERT INTO db_lineage.many_one_hv SELECT * FROM (SELECT * FROM db_lineage.one_many1_hv UNION ALL SELECT * FROM db_lineage.one_many2_hv) 最终;
此查询在版本为 0.14 和 1.2 的 hive 集群上成功执行,但在我的本地系统中,它在我的本地系统上失败。我得到的异常如下: 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(Native Method) 在 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(Native Method) ~[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(Unknown Source) ~[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 依赖项从中检索源节点和目标节点。如果您可以提供任何输入,请告诉我.
感谢和问候, 马亨德拉·托纳佩。
【问题讨论】:
-
我在解析命令时遇到的异常如下:
-
你能分享你正在查询的hiveql吗?看起来就像您查询一个不存在的表一样。