2016-08-09 66 views
1

我想現有的蜂巢外部表分隔符從逗號,改變ctrl+A字符蜂巢改變SERDE性能我能看到的變化不使用蜂巢ALTER TABLE語句</p> <pre><code>ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = 'u0001'); </code></pre> <p>的DDL後工作

show create table table_name 

但是,當我從Hive中選擇時,這些值都是NULL(HDFS中的底層文件被更改爲具有ctrl + A分隔符)。

我也通過使用msck修復了表。

只有看到數據的方法是丟棄和重新創建外部表,任何人都可以請幫我理解原因。

表語法:

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

你是什麼意思「但是當我從** HDFS **中選擇的值都是NULL」?你不是指'Hive'還是'Impala'? – cheseaux

+0

在HIVE中,Alter表正在更改分隔符,但無法正確選擇值。它返回null。 –

+0

這也有助於看到您創建表 – cheseaux

回答

1

ALTER TABLE命令分區表上更改爲未來分區的默認設置。

它將不適用於現有分區,除非特定命令支持CASCADE選項 - 但that's not the caseSET SERDEPROPERTIES;與column management比較例如

所以必須更改每一個現有的分區用這種命令的

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

所以現在是時候爲你運行一個SHOW PARTITIONS,應用一對夫婦正則表達式的上輸出來生成命令列表,運行這些命令,並且永遠快樂。

附註:我可以告訴你,這是真的很痛苦前CASCADE東西終於實現重命名列...

+0

但我收到錯誤,FAILED:執行錯誤,從org.apache.hadoop.hive.ql.exec.DDLTask返回代碼1。無法更改分區。改變是不可能的 –

+0

該死的,另一個Hive功能不起作用...解決方法:因爲它是一個EXTERNAL表,所以你可以安全地刪除每個分區,然後再用相同的「location」添加它 - 並且它會繼承新的來自父表的默認'SerDeProperties'。 –

+0

...但一如既往,在僅包含可消耗數據文件的分區上測試此技巧。如您所知,Hive DDL命令有一大堆bug,並且意外的數據銷燬可能會不時發生。 –

-1

將這個命令改變SERDEPROPERTIES

alter table airlinetestcsv 
SET SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'; 
相關問題