13

尝试从现有 DynamoDB 表创建 Hive 表时出现以下错误:

NoViableAltException(88@[])
at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.identifier(HiveParser_IdentifiersParser.java:9123)
at org.apache.hadoop.hive.ql.parse.HiveParser.identifier(HiveParser.java:30750)
...more stack trace...
FAILED: ParseException line 1:77 cannot recognize input near 'end' 'string' ',' in column specification

查询看起来像这样(简化以保护无辜者):

CREATE EXTERNAL TABLE moveProjects (cid string, end string, category string)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Projects",
    "dynamodb.column.mapping" = "cid:cid,end:end,category:category");

基本上,我正在尝试创建一个包含ProjectsDynamoDB 表内容的 Hive 表,但是 create 语句从 Hive / Hadoop 引发解析错误。

4

4 回答 4

34

该问题实际上不是语法错误,Hive ParseException 只是由 Hive 中的保留关键字(在本例中为end)引起的。

解决方案:在有问题的列名周围使用反引号:

CREATE EXTERNAL TABLE moveProjects (cid string, `end` string, category string)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Projects",
    "dynamodb.column.mapping" = "cid:cid,end:end,category:category");

加上周围的反引号end,查询按预期工作。

Amazon Hive 中的保留字(截至 2013 年 2 月):

IF、HAVING、WHERE、SELECT、UNIQUEJOIN、JOIN、ON、TRANSFORM、MAP、REDUCE、TABLESAMPLE、CAST、FUNCTION、EXTENDED、CASE、WHEN、THEN、ELSE、END、DATABASE、CROSS

资料来源:来自 Facebook Phabricator 追踪器的这张 Hive 票

于 2013-09-05T15:47:53.843 回答
3

如果您仍然想让查询正常工作,您可以随时转义保留关键字!

只需将end替换为`end`

这是保留关键字的列表 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

CREATE EXTERNAL TABLE moveProjects (cid string, `end` string, category string)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Projects",
    "dynamodb.column.mapping" = "cid:cid,end:end,category:category");
于 2018-10-04T09:21:24.457 回答
1

我在进行插入覆盖时在文件夹路径中使用 /Date=20161003 并且它失败了。我将其更改为 /Dt=20161003 并且有效

于 2016-10-03T23:03:54.107 回答
0

我通过这样做解决了这个问题:

插入 my_table(my_field_0, ..., my_field_n) 值(my_value_0, ..., my_value_n)

于 2020-02-05T19:40:04.623 回答