Hive ParseException - 无法识别'end''string'附近的输入

时间:2013-09-05 15:47:54

标签: hadoop mapreduce hive bigdata amazon-dynamodb

尝试从现有的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");

基本上,我正在尝试创建一个包含Projects DynamoDB表内容的Hive表,但是create语句会从Hive / Hadoop中抛出一个解析错误。

4 个答案:

答案 0 :(得分:21)

问题实际上不是语法错误,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

来源:This Hive ticket from the Facebook Phabricator tracker

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

只需将 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");

答案 3 :(得分:0)

我这样做是解决了这个问题:

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