La ruche: SemanticException [Erreur 10002]: Ligne 3:21 Invalide référence de colonne "nom"
Je suis l'aide de la suite de la ruche script de requête pour la version 0.13.0
DROP TABLE IF EXISTS movies.movierating;
DROP TABLE IF EXISTS movies.list;
DROP TABLE IF EXISTS movies.rating;
DROP DATABASE IF EXISTS movies;
ADD JAR /usr/local/hadoop/hive/hive/lib/RegexLoader.jar;
CREATE DATABASE IF NOT EXISTS movies;
CREATE EXTERNAL TABLE IF NOT EXISTS movies.list (id STRING, name STRING, genre STRING)
ROW FORMAT SERDE 'com.cisco.hadoop.loaders.RegexSerDe'with SERDEPROPERTIES(
"input.regex"="^(.*)\\:\\:(.*)\\:\\:(.*)$",
"output.format.string"="%1$s %2$s %3$s");
CREATE EXTERNAL TABLE IF NOT EXISTS movies.rating (id STRING, userid STRING, rating STRING, timestamp STRING)
ROW FORMAT SERDE 'com.cisco.hadoop.loaders.RegexSerDe'
with SERDEPROPERTIES(
"input.regex"="^(.*)\\:\\:(.*)\\:\\:(.*)\\:\\:(.*)$",
"output.format.string"="%1$s %2$s %3$s %4$s");
LOAD DATA LOCAL INPATH 'ml-10M100K/movies.dat' into TABLE movies.list;
LOAD DATA LOCAL INPATH 'ml-10M100K/ratings.dat' into TABLE movies.rating;
CREATE TABLE movies.movierating(id STRING, name STRING, genre STRING, rating STRING);
INSERT OVERWRITE TABLE movies.movierating
SELECT list.id, list.name, list.genre, rating.rating from movies.list list LEFT JOIN movies.rating rating ON (list.id=rating.id) GROUP BY list.id;
Le problème est quand j'execute le script sans la clause "GROUP BY", il fonctionne très bien.
Mais quand je l'execute avec la clause "GROUP BY", j'obtiens l'erreur suivante
FAILED: SemanticException [Error 10002]: Line 4:21 Invalid column reference 'name'
Toutes les idées de ce qui se passe ici?
Remercie de votre aide
Merci!
OriginalL'auteur Piyush Chitkara | 2014-05-02
Vous devez vous connecter pour publier un commentaire.
Si vous groupe par une colonne, sélectionnez votre déclaration ne peut choisir qu'une) cette colonne, b) les colonnes calculées uniquement à partir de cette colonne, ou c) un udaf, nous appliquer à d'autres colonnes.
Dans ce cas, vous êtes seulement le regroupement de la liste.id, de sorte que lorsque vous essayez de sélectionner de la liste.nom, qui est invalide. Pensez-y de cette façon: que faire si votre table de la liste contenait les deux entrées suivantes:
Qu'attendez-vous de cette requête pour le retour:
Dans ce cas, c'est absurde. Je devine que l'id dans la réalité est une clé primaire, mais note que la ruche ne le sait pas, ce qui est au dessus de l'ensemble de données est parfaitement valide.
Avec tout ce que l'esprit, il n'est pas clair pour moi comment résoudre ce problème car je ne sais pas le résultat souhaité. Par exemple, disons que sans le groupe par (juste à la jointure), vous avez en sortie:
Que voudriez-vous la sortie avec le groupe? Ce qui sont que vous essayez d'accomplir en faisant le groupe?
OriginalL'auteur Joe K
OK permettez-moi de voir si je peux demander à ce dans une meilleure façon.
Voici mes deux tables
Liste des films de la table se Compose de films de l'information
Et j'ai les cotes de la table
Ce que je voudrais faire est d'obtenir à la sortie de la manière suivante:
Je ne suis pas un db expert, mais je comprends cela, lorsque vous regroupez les données ensemble, vous avez besoin de convertir plusieurs valeurs pour les valeurs scalaires ou toutes les valeurs, si la chaîne doit être de même droit?
Par exemple dans mon cas précédent, j'ai été de regrouper sous forme de chaîne. Donc, ce qui est correct pour la liste.id, la liste.nom et liste.genre, mais la liste.notation, bien que c'est toujours pour donner quelques problème ici (je viens d'apprendre le PORC avec de la ruche, de sorte que le groupement fonctionne de manière différente)
Donc pour résoudre le problème, je lançais la notation et la moyenne est calculée et stockée dans le flotteur de la table. Jetez un oeil à mon code ci-dessous:
Je vous remercie pour votre explication. Je pourrais sauver la question suivante pour le prochain thread mais c'est mon observation:
La performance de l'Ensemble du travail est réduite lors de l'exécution de Regroupement et de Rejoindre un de l'autre que de le faire dans les deux requêtes distinctes. Pour le même travail, j'avais changé un peu le code pour effectuer le regroupement d'abord et ensuite de joindre les données et les cours de tous les temps a été réduit de 40 secondes. Auparavant, il a été la prise de 140 secondes et maintenant, c'est de prendre les 100 secondes. Toutes les raisons pour que?
Encore une fois merci pour votre explication.
OriginalL'auteur Piyush Chitkara