2016-08-09 49 views
1

Ich versuche, die bestehenden Hive externe Tabelle Begrenzer aus Komma ,-ctrl+A Zeichen zu ändern, indem Sie Hive ALTER TABLE-AnweisungHive ändern serde Eigenschaften funktioniert nicht

ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = '\u0001'); 

Nach der DDL Ich konnte Änderungen sehen

show create table table_name 

Aber wenn ich aus Hive auswählen, sind die Werte alle NULL (zugrunde liegende Dateien in HDFS werden geändert, um Strg + A Trennzeichen zu haben).

Ich habe die Tabelle auch mit msck repariert.

Einzige Möglichkeit, die Daten zu sehen, ist das Löschen und erneute Erstellen der externen Tabelle, kann mir bitte jemand helfen, den Grund zu verstehen.

Tabelle Syntax:

CREATE EXTERNAL TABLE `table_name`(
    col1, 
    col2, 
    col3) 
PARTITIONED BY ( 
    `ing_year` int, 
    `ing_month` int, 
    `ing_day` int) 
ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT 
    'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION 
    'hdfs://location/' 
+0

Was meinen Sie mit "Aber wenn ich aus ** HDFS ** auswähle sind die Werte alle NULL"? Meinst du nicht "Hive" oder "Impala"? – cheseaux

+0

In HIVE ändert Alter Tabelle das Trennzeichen, aber nicht in der Lage, Werte richtig auszuwählen. es gibt null zurück. –

+0

Es würde auch helfen, die Anweisung zu sehen, die Sie verwendet haben, um die Tabelle – cheseaux

Antwort

1

Ein ALTER TABLE Befehl auf einer partitionierten Tabelle ändert die Standardeinstellungen für Zukunft Partitionen.

Aber es wird nicht auf bestehende Partitionen anwenden, es sei denn, dass spezifische Befehl unterstützt die CASCADE Option - aber that's not the case für SET SERDEPROPERTIES; Vergleichen mit column management zum Beispiel

So müssen Sie ALTER jede Partition vorhandene mit dieser Art von Befehl

ALTER TABLE table_name PARTITION (ing_year=2016,ing_month=8,ing_day=31) 
SET SERDEPROPERTIES ('field.delim' = '\u0001'); 

So, jetzt ist es Zeit für Sie ein SHOW PARTITIONS, gelten ein paar RegEx laufen auf Die Ausgabe, um die Liste der Befehle zu generieren, führen Sie diese Befehle aus und glücklich sein, immer danach.

Randbemerkung: Ich kann Ihnen sagen, es war wirklich schmerzhaft eine Spalte umbenennen, bevor die CASCADE Sachen schließlich umgesetzt wurde ...

+0

aber ich bekomme den Fehler, fehlgeschlagen: Execution Error, Rückgabecode 1 von org.apache.hadoop.hive.ql.exec.DDLTask. Partition kann nicht geändert werden. alter ist nicht möglich –

+0

Verdammt, noch ein Hive-Feature, das nicht funktioniert ... Workaround: Da es eine externe Tabelle ist, können Sie sicher jede Partition ablegen und dann erneut mit der gleichen 'Location' hinzufügen - und es wird die neue erben Standard 'SerDeProperties' aus der übergeordneten Tabelle. –

+0

... Testen Sie diesen Trick wie immer auf einer Partition, die nur entbehrliche Datendateien enthält. Wie Sie wissen, haben Hive DDL-Befehle eine ganze Menge Bugs, und von Zeit zu Zeit kann es zu unerwarteten Datenzerstörungen kommen. –

-1

Setzen Sie diesen Befehl für Änderung SERDEPROPERTIES.

alter table airlinetestcsv 
SET SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde';