L'erreur suivante s'affiche lorsque j'essaie de créer une table Hive à partir d'une table DynamoDB existante:
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
La requête ressemble à ceci (simplifié pour protéger l'innocent):
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");
En gros, j'essaie de créer une table Hive contenant le contenu de la table DynamoDB Projects
, mais l'instruction create renvoie une erreur d'analyse de Hive/Hadoop.
Le problème n'est pas réellement une erreur de syntaxe, l'exception Hive ParseException est simplement provoquée par un mot clé réservé dans Hive (dans ce cas, end
).
La solution: utilisez des backticks autour du nom de la colonne incriminée:
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");
Avec les backticks ajoutés autour de end
, la requête fonctionne comme prévu.
SI, Ayant, où, SÉLECTIONNER, UNIQUEJOIN, JOIN, ON, TRANSFORMER, CARTE, RÉDUIRE, TABLESAMPLE, CAST, FONCTION, ÉTENDU, ÉTUI, ALORS, AUTRE, FIN, BASE DE DONNEES, CROSS
J'utilisais/Date = 20161003 dans le chemin du dossier tout en effectuant un écrasement d'insert qui échouait. Je l'ai changé en/Dt = 20161003 et cela a fonctionné
Vous pouvez toujours échapper au mot-clé réservé si vous voulez toujours que votre requête fonctionne!
Il suffit de remplacer end par `end`
Voici la liste des mots clés réservés 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");