hive 报错NoViableAltException

本文介绍了一个关于Hive SQL的常见错误——NoViableAltException,并提供了详细的错误信息及排查过程。通过删除注释中的分号,成功解决了该问题。

hive 报错NoViableAltException

报错内容

报错图片

NoViableAltException(-1@[123:1: selectItem : ( ( tableAllColumns )=> tableAllColumns -> ^( TOK_SELEXPR tableAllColumns ) | ( expression ( ( ( KW_AS )? identifier ) | ( KW_AS LPAREN identifier ( COMMA identifier )* RPAREN ) )? ) -> ^( TOK_SELEXPR expression ( identifier )* ) );])
        at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser$DFA17.specialStateTransition(HiveParser_SelectClauseParser.java:5389)
        at org.antlr.runtime.DFA.predict(DFA.java:80)
        at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectItem(HiveParser_SelectClauseParser.java:2247)
        at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectList(HiveParser_SelectClauseParser.java:1168)
        at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectClause(HiveParser_SelectClauseParser.java:942)

报错排查

insert overwrite table cl_ads.ads_finance_invoicing_mi
partition(ptt_mon,pf)
SELECT account parent_account, -- 母账号
 (balance - recharge_money + charge) beginning_money, -- 期初金额 
recharge_money, -- 本期充值金额, 判断销账类型,如果是月结,不减;其他的销账减 期初=期末-本期充值+本期消耗
shibai_huankuan fail_remission_money,
${ptt_mon} ptt_mon,
           'ws' pf
FROM
   cl_ods.ods_ws_t_record_detail_daily_di
      WHERE ptt_mon = '${ptt_mon}'
     ;

排查错误: 其中注释中包含了 ‘;’ , 造成报错

报错解决

解决方案: 删除注释中的 ’ ;’

参考资料

  • 解决了问题的资料(注释中’;'作为终止符,产生错误,)

https://www.cnblogs.com/barneywill/p/11272426.html
https://blog.youkuaiyun.com/qq_26645205/article/details/78352882

  • 关键字冲突(本例中无效)

https://blog.youkuaiyun.com/qq595662096/article/details/100150850

  • 指定子查询的表名(本例中无效)

https://blog.youkuaiyun.com/Maricle_Again/article/details/100364188

NoViableAltException(9@[]) at org.apache.hadoop.hive.ql.parse.HiveParser.type(HiveParser.java:36813) at org.apache.hadoop.hive.ql.parse.HiveParser.colType(HiveParser.java:36595) at org.apache.hadoop.hive.ql.parse.HiveParser.columnNameTypeConstraint(HiveParser.java:34322) at org.apache.hadoop.hive.ql.parse.HiveParser.columnNameTypeOrConstraint(HiveParser.java:34075) at org.apache.hadoop.hive.ql.parse.HiveParser.columnNameTypeOrConstraintList(HiveParser.java:29819) at org.apache.hadoop.hive.ql.parse.HiveParser.createTableStatement(HiveParser.java:6662) at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:4295) at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:2494) at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1420) at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:220) at org.apache.hadoop.hive.ql.parse.ParseUtils.parse(ParseUtils.java:74) at org.apache.hadoop.hive.ql.parse.ParseUtils.parse(ParseUtils.java:67) at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:616) at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1826) at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:1773) at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:1768) at org.apache.hadoop.hive.ql.reexec.ReExecDriver.compileAndRespond(ReExecDriver.java:126) at org.apache.hadoop.hive.ql.reexec.ReExecDriver.run(ReExecDriver.java:214) at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:239) at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:188) at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:402) at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:821) at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:759) at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAcce
最新发布
05-13
### 关于 HiveNoViableAltException 的解决方案 NoViableAltException 是 Antlr 报错的一种形式,通常表示语法解析器无法找到匹配的规则来处理当前输入的内容。这种错误可能由多种原因引起,比如语法定义不清晰、语法规则冲突或者输入数据不符合预期。 #### 1. **理解 NoViableAltException** 该异常表明在指定位置 (如 `9@[]`) 处找不到合适的替代路径来进行解析[^1]。具体到 HiveLexer.g 文件中的错误日志显示多个语法错误点,这些错误可能是由于注释操作破坏了原有的词法结构所致。 #### 2. **解决方法** ##### a. 检查被注释部分的影响 当使用 `/ * */` 注释掉一段代码时,可能会意外地改变上下文环境,从而导致解析失败。例如,如果注释掉了某些关键字或分隔符,则后续的解析逻辑会受到影响。因此建议重新审视被注释的部分是否包含必要的语法成分。 ```java // 示例:假设下面这段 SQL 被部分注释 SELECT /*+ MAPJOIN(user)*/ user_id FROM users WHERE status = 'active'; /* 如果只保留 SELECT 部分而移除其他内容 */ SELECT /* 这里缺少完整的表达式 */ ; ``` ##### b. 修改 Grammar 定义文件 对于自定义的 HiveLexer 或者 HiveParser grammar 文件来说,确保所有的 token 和 rule 正确无误非常重要。可以尝试以下调整: - 添加缺失的动作 (`ACTION`)。 - 补充遗漏的终止符号(如`;`)。 以下是修正后的示例片段: ```antlr lexer grammar HiveLexer; SEMI : ';' ; // 明确声明分号作为结束标志之一 KW_TRUE : 'TRUE' ; // 其他 Tokens... ``` ##### c. 更新工具版本 有时旧版 ANTLR 工具可能存在 bug 导致此类问题发生。升级至最新稳定发行版或许能够缓解一些兼容性难题。 #### 3. **验证修复效果** 完成上述更改后再次运行编译过程并观察是否有新的警告消息出现。如果没有进一步提示,则说明初步解决了这个问题;否则继续定位剩余未解决问题所在之处。 ```bash # 编译命令样例 antlr4 -Dlanguage=Java HiveLexer.g4 javac *.java ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值