web-dev-qa-db-fra.com

Alter Hive table ajouter ou supprimer une colonne

J'ai une table Orc dans Hive Je veux supprimer une colonne de cette table

ALTER TABLE table_name drop  col_name;

mais j'obtiens l'exception suivante 

Une erreur s'est produite lors de l'exécution de la requête Hive: OK FAILED: la ligne 1:35 ParseException ne correspond pas à l'entrée 'user_id1' en attente de PARTITION proche de 'drop' dans une instruction de partition drop

Quelqu'un peut-il m'aider ou me donner une idée? Remarque, je suis using Hive 0.14

15
Aryan Singh

Vous ne pouvez pas supprimer directement une colonne d'une table à l'aide de la commande ALTER TABLE table_name drop col_name;

La seule façon de supprimer une colonne consiste à utiliser la commande replace. Disons que j'ai une table emp avec identifiant, nom et colonne dept. Je veux supprimer la colonne id de la table emp. Indiquez donc toutes les colonnes dont vous souhaitez faire partie dans la clause replace columns. La commande ci-dessous supprimera la colonne id de la table emp. 

 ALTER TABLE emp REPLACE COLUMNS( name string, dept string);
18
Reena Upadhyay

supposons que vous ayez une table externe, à savoir. organization.employee as: (sans TBLPROPERTIES)

Hive> show create table organization.employee;
OK
CREATE EXTERNAL TABLE `organization.employee`(
      `employee_id` bigint,
      `employee_name` string,
      `updated_by` string,
      `updated_date` timestamp)
    ROW FORMAT SERDE
      'org.Apache.hadoop.Hive.ql.io.orc.OrcSerde'
    STORED AS INPUTFORMAT
      'org.Apache.hadoop.Hive.ql.io.orc.OrcInputFormat'
    OUTPUTFORMAT
      'org.Apache.hadoop.Hive.ql.io.orc.OrcOutputFormat'
    LOCATION
      'hdfs://getnamenode/apps/Hive/warehouse/organization.db/employee'

Vous souhaitez supprimer updated_by, updated_date columns de la table. Suivez ces étapes:

créer une réplique de table temporaire de organization.employee en tant que:

Hive> create table organization.employee_temp as select * from organization.employee;

déposez l'organisation de la table principale.

Hive> drop table organization.employee;

supprimer les données sous-jacentes de HDFS (nécessité de sortir de Hive Shell)

[nameet@ip-80-108-1-111 myfile]$ hadoop fs -rm hdfs://getnamenode/apps/Hive/warehouse/organization.db/employee/*

créer la table avec les colonnes supprimées selon les besoins:

Hive> CREATE EXTERNAL TABLE `organization.employee`(
  `employee_id` bigint,
  `employee_name` string)
ROW FORMAT SERDE
  'org.Apache.hadoop.Hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
  'org.Apache.hadoop.Hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
  'org.Apache.hadoop.Hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://getnamenode/apps/Hive/warehouse/organization.db/employee'

réinsérez les enregistrements d'origine dans la table d'origine.

Hive> insert into organization.employee 
select employee_id, employee_name from organization.employee_temp;

enfin, supprimez la table temporaire créée

Hive> drop table organization.employee_temp;
3
Nameet Nayan
ALTER TABLE emp REPLACE COLUMNS( name string, dept string);

L’instruction ci-dessus ne peut changer que le schéma d’une table, pas les données .. Une solution à ce problème pour copier des données dans une nouvelle table.

Insert <New Table> Select <selective columns> from <Old Table> 
2
Vikas Jindal

ALTER TABLE n'est pas encore pris en charge pour les tables non natives. c'est-à-dire ce que vous obtenez avec CREATE TABLE lorsqu'une clause STORED BY est spécifiée.

vérifier ceci https://cwiki.Apache.org/confluence/display/Hive/StorageHandlers

0
Sat

Il existe également un moyen "stupide" d'atteindre l'objectif final, qui consiste à créer une nouvelle table sans les colonnes non souhaitées. L'utilisation de regex matching de Hive facilitera cette tâche.

Voici ce que je ferais:

-- make a copy of the old table
ALTER TABLE table RENAME TO table_to_dump;

-- make the new table without the columns to be deleted
CREATE TABLE table AS
SELECT `(col_to_remove_1|col_to_remove_2)?+.+`
FROM table_to_dump;

-- dump the table 
DROP TABLE table_to_dump;

Si la table en question n'est pas trop grande, cela devrait fonctionner correctement.

0
ccy