web-dev-qa-db-ja.com

Hive ParseException-「end」「string」付近の入力を認識できません

既存の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から解析エラーをスローしています。

8
Jens Roland

この問題は実際には構文エラーではなく、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チケット

23
Jens Roland

挿入の上書き中にフォルダーパスで/ Date = 20161003を使用していましたが、失敗していました。/Dt = 20161003に変更し、機能しました

1
Sat

クエリを機能させたい場合は、予約キーワードをいつでもエスケープできます!!

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");
0
naren