既存の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から解析エラーをスローしています。
この問題は実際には構文エラーではなく、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
の周りに追加されたバックティックにより、クエリは期待どおりに機能します。
IF、HAVING、WHERE、SELECT、UNIQUEJOIN、JOIN、ON、TRANSFORM、MAP、REDUCE、TABLESAMPLE、CAST、FUNCTION、EXTENDED、CASE、WHEN、THEN、ELSE、END、DATABASE、CROSS
挿入の上書き中にフォルダーパスで/ Date = 20161003を使用していましたが、失敗していました。/Dt = 20161003に変更し、機能しました
クエリを機能させたい場合は、予約キーワードをいつでもエスケープできます!!
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");