webentwicklung-frage-antwort-db.com.de

Ändern Sie die Spalte zum Hinzufügen oder Ablegen der Hive-Tabelle

Ich habe eine orc-Tabelle in Hive. Ich möchte eine Spalte aus dieser Tabelle löschen

ALTER TABLE table_name drop  col_name;

aber ich bekomme die folgende ausnahme 

Fehler beim Ausführen der Hive-Abfrage: OK FAILED: ParseException-Zeile 1:35 stimmt nicht mit der Eingabe 'user_id1' überein, die erwartet, dass PARTITION in der Drop-Partitionsanweisung in der Nähe von 'drop' steht

Kann mir jemand helfen oder eine Idee dafür geben? Beachten Sie, ich bin using Hive 0.14

15
Aryan Singh

Sie können die Spalte mit dem Befehl ALTER TABLE table_name drop col_name; nicht direkt aus einer Tabelle löschen.

Die einzige Möglichkeit, die Spalte zu löschen, ist der Befehl replace. Nehmen wir an, ich habe eine Tabelle mit ID, Name und Spalte. Ich möchte die id-Spalte der Tabelle emp löschen. Geben Sie also alle Spalten an, die Teil der Tabelle in der Klausel zum Ersetzen von Spalten sein sollen. Der folgende Befehl löscht die ID-Spalte aus der Emp-Tabelle. 

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

angenommen, Sie haben einen externen Tisch, nämlich. organisation.mitarbeiter wie: (ohne 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'

Sie möchten updated_by, updated_date column aus der Tabelle entfernen. Folge diesen Schritten:

erstellen Sie ein temporäres Tabellenreplikat von organization.employee als:

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

löschen Sie die Haupttabelle organisation.mitarbeiter.

Hive> drop table organization.employee;

entfernen Sie die zugrunde liegenden Daten aus HDFS (müssen aus Hive Shell herauskommen)

[[email protected] myfile]$ hadoop fs -rm hdfs://getnamenode/apps/Hive/warehouse/organization.db/employee/*

erstellen Sie die Tabelle mit den entfernten Spalten nach Bedarf:

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'

legen Sie die Originaldatensätze wieder in die Originaltabelle ein.

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

lassen Sie die erstellte Temp-Tabelle schließlich fallen

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

Die obige Anweisung kann nur das Schema einer Tabelle ändern, nicht die Daten. Eine Lösung dieses Problems zum Kopieren von Daten in eine neue Tabelle.

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

ALTER TABLE wird für nicht native Tabellen noch nicht unterstützt. d. h., was Sie mit CREATE TABLE erhalten, wenn eine STORED BY-Klausel angegeben wird.

Überprüfen Sie diese https://cwiki.Apache.org/confluence/display/Hive/StorageHandlers

0
Sat

Es gibt auch eine "dumme" Möglichkeit, das Endziel zu erreichen, nämlich das Erstellen einer neuen Tabelle ohne die Spalten, die nicht gewünscht werden. Die Verwendung von Hive regex match macht dies ziemlich einfach.

Folgendes würde ich tun:

-- 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;

Wenn der betreffende Tisch nicht zu groß ist, sollte dies gut funktionieren.

0
ccy