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
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,但不刪除資料。