hive 报错NoViableAltException

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

hive> select explode(split(table words,',')); NoViableAltException(301@[]) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.function(HiveParser_IdentifiersParser.java:3519) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.atomExpression(HiveParser_IdentifiersParser.java:7081) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceFieldExpression(HiveParser_IdentifiersParser.java:7172) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceUnaryPrefixExpression(HiveParser_IdentifiersParser.java:7671) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceUnarySuffixExpression(HiveParser_IdentifiersParser.java:7727) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceBitwiseXorExpression(HiveParser_IdentifiersParser.java:7889) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceStarExpression(HiveParser_IdentifiersParser.java:8032) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedencePlusExpression(HiveParser_IdentifiersParser.java:8175) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceConcatenateExpression(HiveParser_IdentifiersParser.java:8314) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceAmpersandExpression(HiveParser_IdentifiersParser.java:8524) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceBitwiseOrExpression(HiveParser_IdentifiersParser.java:8661) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceSimilarExpressionMain(HiveParser_IdentifiersParser.java:9144) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceSimilarExpression(HiveParser_IdentifiersParser.java:9040) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceEqualExpression(HiveParser_IdentifiersParser.java:10254) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceNotExpression(HiveParser_IdentifiersParser.java:10541) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceAndExpression(HiveParser_IdentifiersParser.java:10650) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceOrExpression(HiveParser_IdentifiersParser.java:10791) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.expression(HiveParser_IdentifiersParser.java:6870) at org.apache.hadoop.hive.ql.parse.HiveParser.expression(HiveParser.java:45188) at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectExpression(HiveParser_SelectClauseParser.java:2296) at org.apache.hadoop.hive.ql.parse.HiveParser.selectExpression(HiveParser.java:45128) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.function(HiveParser_IdentifiersParser.java:3581) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.atomExpression(HiveParser_IdentifiersParser.java:7081) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceFieldExpression(HiveParser_IdentifiersParser.java:7172) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceUnaryPrefixExpression(HiveParser_IdentifiersParser.java:7671) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceUnarySuffixExpression(HiveParser_IdentifiersParser.java:7727) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceBitwiseXorExpression(HiveParser_IdentifiersParser.java:7889) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceStarExpression(HiveParser_IdentifiersParser.java:8032) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedencePlusExpression(HiveParser_IdentifiersParser.java:8175) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceConcatenateExpression(HiveParser_IdentifiersParser.java:8314) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceAmpersandExpression(HiveParser_IdentifiersParser.java:8524) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceBitwiseOrExpression(HiveParser_IdentifiersParser.java:8661) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceSimilarExpressionMain(HiveParser_IdentifiersParser.java:9144) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceSimilarExpression(HiveParser_IdentifiersParser.java:9040) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceEqualExpression(HiveParser_IdentifiersParser.java:10254) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceNotExpression(HiveParser_IdentifiersParser.java:10541) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceAndExpression(HiveParser_IdentifiersParser.java:10650) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.precedenceOrExpression(HiveParser_IdentifiersParser.java:10791) at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.expression(HiveParser_IdentifiersParser.java:6870) at org.apache.hadoop.hive.ql.parse.HiveParser.expression(HiveParser.java:45188) at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectItem(HiveParser_SelectClauseParser.java:1720) at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectList(HiveParser_SelectClauseParser.java:1209) at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectClause(HiveParser_SelectClauseParser.java:1004) at org.apache.hadoop.hive.ql.parse.HiveParser.selectClause(HiveParser.java:45252) at org.apache.hadoop.hive.ql.parse.HiveParser.atomSelectStatement(HiveParser.java:39777) at org.apache.hadoop.hive.ql.parse.HiveParser.selectStatement(HiveParser.java:40044) at org.apache.hadoop.hive.ql.parse.HiveParser.regularBody(HiveParser.java:39690) at org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpressionBody(HiveParser.java:38900) at org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpression(HiveParser.java:38788) at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:2396) 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.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:221) at org.apache.hadoop.util.RunJar.main(RunJar.java:136) FAILED: ParseException line 1:21 cannot recognize input near 'table' 'words' ',' in function specification
最新发布
07-10
<think>我们正在分析用户的问题:用户尝试在Hive中创建外部表,但两次都失败了,错误信息都是"Path is not a directory: /words/words.txt"。从错误信息可以看出,用户指定的LOCATION路径是一个文件(/words/words.txt),而Hive要求外部表的LOCATION必须是一个目录。 用户上一次的问题和错误信息已经给出,我们注意到用户两次执行了相同的建表语句,都失败了。因此,我们需要指导用户如何正确创建外部表。 解决方案: 1. 确保LOCATION指向的是一个目录,而不是文件。 2. 如果用户确实想使用该文件,那么应该将文件放在一个目录下,然后指定该目录。 具体步骤: 步骤1:在HDFS上创建目录(如果目录不存在) 步骤2:将文件移动到该目录下(如果文件目前不在正确的目录结构中) 步骤3:修改建表语句,将LOCATION指向该目录 例如,假设用户的数据文件是words.txt,并且希望放在HDFS的/words目录下: - 首先,创建目录:`hadoop fs -mkdir -p /words` - 然后,将文件上传到该目录:`hadoop fs -put words.txt /words/` - 最后,创建外部表,指定LOCATION为'/words'(注意是目录) 建表语句修正如下: create external table words(word array<string>) row format delimited collection items terminated by ' ' location '/words'; -- 这里指定目录,而不是文件 注意:原语句中指定的location是'/words/words.txt',这是一个文件路径,所以报错。 另外,根据引用[1]和[4],用户可能后续想使用explode函数来处理数组。因此,在创建表之后,用户可以使用explode函数将数组列拆分成多行。 例如,查询语句可能是: select explode(word) as single_word from words; 但是,如果用户的数据文件中的每一行是由空格分隔的多个单词,那么使用array<string>类型和空格作为分隔符是正确的。这样,每行数据会被读入一个数组。 现在,我们给出完整的回答。</think>### 解决 Hive SQL 中 `explode()` 和 `split()` 的语法错误 您在尝试对 `words` 表使用 `explode()` 和 `split()` 函数时遇到的 `ParseException` 通常由以下原因引起: #### 常见错误原因及解决方案 1. **`explode()` 使用位置错误** `explode()` 是表生成函数(UDTF),不能直接在 SELECT 子句中使用(需配合 `LATERAL VIEW`)[^4] ❌ 错误写法: ```sql SELECT explode(word) FROM words; ``` ✅ 正确写法: ```sql SELECT single_word FROM words LATERAL VIEW explode(word) exploded_table AS single_word; ``` 2. **`split()` 与 `explode()` 组合错误** 当需要先拆分字符串再展开时: ❌ 错误写法: ```sql SELECT explode(split(sentence, ' ')) FROM sentences; ``` ✅ 正确写法: ```sql SELECT word FROM sentences LATERAL VIEW explode(split(sentence, ' ')) t AS word; ``` 3. **数组类型处理错误** 如果 `word` 列不是数组类型(需先转换): ```sql SELECT exploded_word FROM ( SELECT split(sentence, ' ') AS word_array FROM sentences ) tmp LATERAL VIEW explode(word_array) t AS exploded_word; ``` #### 完整示例 假设数据格式(`/words/words.txt`): ``` hello world hive sql big data ``` 1. **创建表**(确保使用目录路径): ```sql CREATE EXTERNAL TABLE words ( word_array ARRAY<STRING> ) ROW FORMAT DELIMITED COLLECTION ITEMS TERMINATED BY ' ' LOCATION '/words'; -- 必须是目录 ``` 2. **正确查询语句**: ```sql -- 展开数组列 SELECT exploded_word FROM words LATERAL VIEW explode(word_array) t AS exploded_word; -- 拆分字符串并展开(如果列是字符串) SELECT exploded_word FROM ( SELECT split(sentence, ' ') AS word_arr FROM sentences -- 假设有字符串列sentence ) tmp LATERAL VIEW explode(word_arr) t AS exploded_word; ``` #### 输出结果 ``` exploded_word -------------- hello world hive sql big data ``` #### 关键注意事项 1. **`LATERAL VIEW` 必要性** UDTF 函数如 `explode()` 必须配合 `LATERAL VIEW` 使用[^4] 2. **数据类型验证** 使用 `DESCRIBE FORMATTED words` 确认列是否为 `array<string>` 3. **空值处理** 添加 `WHERE word_array IS NOT NULL` 避免空数组报错 4. **性能优化** 大表使用 `WHERE` 过滤后再展开(`HAVING` 用于聚合后过滤)[^3] > **调试建议**:先执行 `SELECT word_array FROM words LIMIT 1` 验证数据是否按数组格式正确加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值