1. 程式人生 > >Hive學習之修改表、分割槽、列

Hive學習之修改表、分割槽、列

修改表的語句允許改變現有表的結構,通過該語句可以增加列/分割槽,修改SerDe,增加表和SerDe的屬性或者重命名錶。與之類似,修改分割槽的語句可以改變指定分割槽的屬性。

重命名錶

重命名錶的語句如下:

ALTER TABLE table_name RENAME TO new_table_name

修改表屬性

修改表屬性的語句如下:

ALTER TABLE table_name SET TBLPROPERTIES (property_name = property_value, property_name = property_value,... )

使用該語句可以增加表的元資料,last_modified_by

, last_modified_time屬性自動被新增和管理,可以使用DESCRIBE EXTENDED table_name查詢新增的表屬性。

修改表註釋

要修改表的註釋,只需要使用上面介紹的修改表屬性語句,將property_name指定為'comment' 屬性即可:

ALTER TABLE table_name SET TBLPROPERTIES('comment' = new_comment);

增加SerDe屬性

增加SerDe屬性的語句如下:

ALTER TABLE table_name SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties]
ALTER TABLE table_name SET SERDEPROPERTIES
(property_name = property_value,property_name = property_value, ... )

該語句允許向SerDe物件增加自定義的元資料。SerDe屬性在SerDe被Hive初始化時傳遞給表的SerDe。

修改表的儲存屬性

ALTER TABLE table_name CLUSTEREDBY (col_name, col_name, ...) [SORTED BY (col_name, ...)] INTO num_buckets BUCKETS

該語句改變表的物理儲存屬性。

需要注意的時,上述修改表的語句僅修改表的Hive的元資料,不會重新組織或者重新格式化現存資料,使用者需要確定實際的資料佈局符合元資料的定義。

新增分割槽

新增分割槽的語句為:

ALTER TABLEtable_name ADD [IF NOT EXISTS] PARTITION partition_spec[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...
 
partition_spec:
  :(partition_col = partition_col_value, partition_col = partiton_col_value, ...)

特別地,下面的例子將失敗且不會報錯,無論指定哪個分割槽,所有的查詢都將在分割槽dt='2008-08-08'上執行:

ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us')
location '/path/to/us/part080808' PARTITION (dt='2008-08-09',country='us') location '/path/to/us/part080809';

假設表不能存在分割槽而執行新增分割槽的操作將會提示錯誤資訊:

hive> alter tabletable_properties add partition (address='china');
FAILED:SemanticException table is not partitioned but partition spec exists:{address=china}

這是由於在新建表的時候,並沒有建立分割槽列address,所以只有在存在分割槽列的表上執行增加分割槽的操作,才會成功。

重新命名分割槽

重新命名分割槽的語句如下:

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
partition_spec:
  :(partition_col = partition_col_value, partition_col = partiton_col_value, ...)

示例程式碼如下:

hive> showpartitions people;
OK
department=1/sex=0/howold=23
Time taken:0.349 seconds, Fetched: 1 row(s)
hive> altertable people partition(department='1',sex='0',howold=23) rename to partition(department='2',sex='1',howold=24);         
OK
Time taken:2.005 seconds
hive> showpartitions people;
OK
department=2/sex=1/howold=24
Time taken:0.271 seconds, Fetched: 1 row(s)

交換分割槽

交換分割槽的語句如下:

ALTER TABLEtable_name_1 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_2;

該語句允許將一個分割槽中的資料移動另一個擁有相同schema但沒有那個分割槽的表中。

恢復分割槽(MSCKREPAIR TABLE)

Hive在元儲存中為每個表儲存了一個分割槽列表,然而如果新分割槽直接新增到HDFS中(使用hadoop fs –put),Hive不會知道這些分割槽,除非在每個新新增的分割槽上執行ALTER TABLEtable_name ADD PARTITION命令。為了避免重複執行上述命令,可以使用如下的命令:

MSCK REPAIR TABLE table_name;

該語句將把存在於HDFS上但不在元儲存上的分割槽新增到元儲存中,示例如下:

hive> dfs -mkdir /user/hive/warehouse/learning.db/people/department=1/sex=0/howold=23;
hive> show partitions people;
OK
department=2/sex=1/howold=24
Time taken:0.192 seconds, Fetched: 1 row(s)
hive> msck repair table people;
OK
Partitions notin metastore:     people:department=1/sex=0/howold=23
Repair: Addedpartition to metastore people:department=1/sex=0/howold=23
Time taken:0.943 seconds, Fetched: 2 row(s)
hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.397 seconds, Fetched: 2 row(s)

刪除分割槽

刪除分割槽的語句為:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec,PARTITION partition_spec,...

可以使用上述語句刪除表的分割槽,該語句將會刪除指定分割槽的資料和元資料。對於受NO DROP CASCADE的表,可以使用IGNORE PROTECTION刪除指定的分割槽或一組分割槽,該語句如下:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec IGNORE PROTECTION;

刪除分割槽的例子如下,從該例子可以發現,當刪除並不存在的分割槽時不會提示錯誤資訊。

hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.397 seconds, Fetched: 2 row(s)
hive> alter table people drop partition (department='2',sex='2',howold=24);
OK
Time taken:1.596 seconds
hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.227 seconds, Fetched: 2 row(s)
hive> alter table people drop partition (department='2',sex='1',howold=24);
Dropped the partition department=2/sex=1/howold=24
OK
Time taken:2.267 seconds
hive> show partitions people;                                              
OK
department=1/sex=0/howold=23
Time taken:0.191 seconds, Fetched: 1 row(s)

解檔/歸檔分割槽

ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;

Hive中的歸檔移動分割槽中的檔案到Hadoop歸檔中(HAR),該語句只會減少檔案的數量,但不提供壓縮。

修改表/分割槽的檔案格式

ALTER TABLE table_name [PARTITION partitionSpec] SET FILEFORMAT file_format

可以使用上述語句修改表或者分割槽的檔案格式,Hive支援的檔案格式有:SEQUENCEFILE、TEXTFILE、RCFILE 、ORC和INPUTFORMAT input_format_classnameOUTPUTFORMAT output_format_classname,預設的檔案格式為TEXTFILE,由配置引數hive.default.fileformat指定。TEXTFILE指以純文字檔案儲存資料,在資料需要壓縮時使用SEQUENCEFILE,使用INPUTFORMAT和OUTPUTFORMAT指定輸入格式和輸出格式的類名,比如'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'。

修改表/分割槽的檔案位置

ALTER TABLE table_name [PARTITIONpartitionSpec] SET LOCATION "newlocation"

修改表/分割槽的Touch

TOUCH讀元資料,然後寫回。這能夠觸發前置或者後者hook的執行,假設是存在一個記錄表或者分割槽修改的hook和直接修改HDFS上檔案的外部指令碼。由於外部指令碼在Hive之外修改檔案,修改不會被hook所記錄,這是外部指令碼可以呼叫TOUCH以觸發hook,然後標記上述表或者分割槽為已修改的。修改表或者分割槽的TOUCH語句如下:

ALTER TABLE table_name TOUCH [PARTITION partitionSpec];

修改表/分割槽的保護

可以在表級或者分割槽級設定資料保護。啟用NO_DROP將保護表或者分割槽被刪除,啟用OFFLINE將阻止表或者分割槽中的資料被查詢,但元資料依然可以被訪問。如果表中的任何分割槽啟用了NO_DROP,該表也不能被刪除。修改表或者分割槽保護的語句如下:

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP;
ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE;

演示程式碼及結果如下:

hive> alter table iis enable no_drop;
OK
Time taken: 0.792seconds
hive> drop tableiis;
FAILED: ExecutionError, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Table iis isprotected from being dropped
hive> alter tableiis enable offline;
OK
Time taken: 0.439seconds
hive> select *from iis;
FAILED:SemanticException [Error 10113]: Query against an offline table or partitionTable iis
hive> alter tablepeople partition (department='1', sex='0', howold=23) enable no_drop;
OK
Time taken: 1.23 seconds
hive> drop table people;
FAILED: ExecutionError, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Table peoplePartitiondepartment=1/sex=0/howold=23 is protected from being dropped

修改列名/型別/位置/註釋

下面的語句允許修改列名稱、列型別、列註釋、列位置。該語句僅修改Hive元資料,不會觸動表中的資料,使用者需要確定實際的資料佈局符合元資料的定義。

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENTcol_comment] [FIRST|(AFTER column_name)]

示例程式碼及結果如下:

hive> alter table people change telephone mobile string comment 'change column name' first;
OK
Time taken: 0.66seconds
hive>describe people;                                                                    
OK
mobile                string                   changecolumn name 
name                string                                       
age                   int                                         
birthday                date                                       
address                string                                       
department             string                                       
sex                   string                                       
howold              int                                         
# PartitionInformation          
# col_name                  data_type               comment            
            department              string                                       
sex                   string                                       
howold              int 

 增加/替換列

增加或者替換列的語句如下,其中ADD COLUMNS在現有列之後但在分割槽列之前增加新列,REPLACE COLUMNS先刪除現存列,然後再增加新列。替換列只能在表使用自帶SerDe(DynamicSerDe,MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe)時使用。

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type[COMMENT col_comment], ...)

REPLACE COLUMNS也可以用於刪除列,例如:

hive> alter table test add columns (e int comment 'Add new column e');
OK
Time taken: 0.395seconds
hive> describetest;
OK
a                   int                                         
b                   int                                         
c                   int                                         
e                   int                     Add new column e   
d                   int                                         
             
# PartitionInformation          
# col_name                  data_type               comment            
             
d                   int                                         
Time taken: 0.209seconds, Fetched: 10 row(s)
hive> alter table test replace columns (a1 string, b1 string, c1 string);
OK
Time taken: 0.994seconds
hive> describe test;
OK
a1                  string                                       
b1                  string                                       
c1                  string                                       
d                   int                                         
             
# PartitionInformation          
# col_name                  data_type               comment            
             
d                   int                                         
Time taken: 0.232seconds, Fetched: 9 row(s)

需要注意的是該刪除僅修改表的schema,但不刪除資料。