La ruche: Créer une Table de Partition et Par
J'ai une table avec les données chargées comme suit:
create table xyzlogTable (dateC string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' with serdeproperties( "input.regex" = "(\\S+)\\t(\\d+):(\\d+):(\\d+)\\t(\\S+)\\t(\\S+)\\t(\\S+)\\t(\\S+)", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s") stored as textfile;
load data local inpath '/home/hadoop/hive/xyxlogData/' into table xyxlogTable;
total nombre de lignes est trouvé à plus de 3 millions de dollars. certaines requêtes fonctionnent bien et d'autres s'en boucle infinie.
après avoir vu que sélectionner, groupe par requêtes prendre longtemps, et parfois même pas de renvoyer des résultats, a décidé d'aller pour le partitionnement.
Mais les deux affirmations suivantes sont défaillants:
create table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string);
A ÉCHOUÉ: Erreur dans les métadonnées: AlreadyExistsException(message:la Table xyzlogTable existe déjà)
A ÉCHOUÉ: Erreur d'Exécution, le code de retour 1 de org.apache.hadoop.de la ruche.ql.exec.DDLTask
Alter table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string);
A ÉCHOUÉ: Erreur d'analyse: ligne 1:12 ne peut pas reconnaître d'entrée 'xyzlogTable' dans l'instruction alter table
Aucune idée de quel est le problème!!!!
OriginalL'auteur Srinivas | 2012-12-10
Vous devez vous connecter pour publier un commentaire.
C'est précisément pourquoi je préfère utiliser des tables externes dans la Ruche. Le tableau que vous avez créé n'est pas externe (que vous avez utilisé
create table
au lieu decreate external table
). Avec les tables externes, la suppression de la table, supprime les métadonnées (nom, les noms de colonnes, les types, etc.) et les données de la table dans HDFS. Au contraire, lorsqu'une table est supprimée, seules les métadonnées sont supprimées, les données dans HDFS autour de bâtons.Vous avez quelques options:
Si le coût de l'importation est élevé et les données déjà n'est pas partitionné. Garder cette table autour de, mais de créer une nouvelle table à dire xyzlogTable_partitioned qui va être partitionnée version de ce tableau. Vous pouvez utiliser Partitionnement Dynamique dans la Ruche pour remplir cette nouvelle table.
Si le coût de l'importation est élevé, mais les données sont déjà partitionné; par exemple, dire que vous avez déjà données dans des fichiers séparés pour chaque partition dans HDFS. Créer une nouvelle table partitionnée et avoir un script bash (ou l'équivalent), déplacer (ou copier et supprimer ultérieurement, si vous êtes conservateur) de la HDFS répertoire correspondant à l'onu-table partitionnée dans le répertoire correspondant à la partition appropriée de la nouvelle table.
Si l'importation n'est pas cher: - déposer l'ensemble de la table. Re-créer une nouvelle table partitionnée et ré-importer. De nombreuses fois, si le processus d'importation n'est pas au courant de la partition de schéma (en d'autres termes, si l'importation ne pouvez pas envoyer des données dans les partitions), il s'agit d'un cas d'utilisation pour avoir un disque non partitionné de la table (comme celui que vous avez déjà) une table intermédiaire et ensuite utiliser une requête de la Ruche ou de partitionnement dynamique pour remplir une nouvelle table partitionnée utilisé dans les requêtes suivantes du flux de travail.
OriginalL'auteur Mark Grover
Vous devez d'abord déposer votre table qui a déjà été créé, puis de créer la table partitionnée. Ou de modifier le nom de votre table.
OriginalL'auteur Jickson T George