web-dev-qa-db-fra.com

Hive ParseException - impossible de reconnaître une entrée proche de 'end' 'chaîne'

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.

5
Jens Roland

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.

Mots réservés dans Amazon Hive (à partir de février 2013):

SI, Ayant, où, SÉLECTIONNER, UNIQUEJOIN, JOIN, ON, TRANSFORMER, CARTE, RÉDUIRE, TABLESAMPLE, CAST, FONCTION, ÉTENDU, ÉTUI, ALORS, AUTRE, FIN, BASE DE DONNEES, CROSS

Source: Ce ticket Hive du tracker Facebook Phabricator

21
Jens Roland

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é

1
Sat

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