Hive表的基本操作


Hive系列文章

  1. Hive表的基本操作
  2. Hive中的集合數據類型
  3. Hive動態分區詳解
  4. hive中orc格式表的數據導入
  5. Java通過jdbc連接hive
  6. 通過HiveServer2訪問Hive
  7. SpringBoot連接Hive實現自助取數
  8. hive關聯hbase表
  9. Hive udf 使用方法
  10. Hive基于UDF進行文本分詞
  11. Hive窗口函數row number的用法
  12. 數據倉庫之拉鏈表

1. 創建表

create table語句遵從sql語法習慣,只不過Hive的語法更靈活。例如,可以定義表的數據文件存儲位置,使用的存儲格式等。

create table if not exists test.user1(
name string comment 'name',
salary float comment 'salary',
address struct<country:string, city:string> comment 'home address'
)
comment 'description of the table'
partitioned by (age int)
row format delimited fields terminated by '\t'
stored as orc;
SQL

沒有指定external關鍵字,則為管理表,跟mysql一樣,if not exists如果表存在則不做操作,否則則新建表。comment可以為其做注釋,分區為age年齡,列之間分隔符是\t,存儲格式為列式存儲orc,存儲位置為默認位置,即參數hive.metastore.warehouse.dir(默認:/user/hive/warehouse)指定的hdfs目錄。

2. 拷貝表

使用like可以拷貝一張跟原表結構一樣的空表,里面是沒有數據的。

create table if not exists test.user2 like test.user1;
SQL

3. 查看表結構

通過desc [可選參數] tableName命令查看表結構,可以看出拷貝的表test.user1與原表test.user1的表結構是一樣的。

hive> desc test.user2;
OK
name                    string                  name                
salary                  float                   salary              
address                 struct<country:string,city:string>    home address        
age                     int                                         

# Partition Information      
# col_name              data_type               comment             

age                     int                                         
SQL

也可以加formatted,可以看到更加詳細和冗長的輸出信息。

hive> desc formatted test.user2;
OK
# col_name              data_type               comment             

name                    string                  name                
salary                  float                   salary              
address                 struct<country:string,city:string>    home address        

# Partition Information      
# col_name              data_type               comment             

age                     int                                         

# Detailed Table Information         
Database:               test                     
Owner:                  hdfs                     
CreateTime:             Mon Dec 21 16:37:57 CST 2020     
LastAccessTime:         UNKNOWN                  
Retention:              0                        
Location:               hdfs://nameservice2/user/hive/warehouse/test.db/user2    
Table Type:             MANAGED_TABLE            
Table Parameters:        
    COLUMN_STATS_ACCURATE   {\"BASIC_STATS\":\"true\"}
    numFiles                0                   
    numPartitions           0                   
    numRows                 0                   
    rawDataSize             0                   
    totalSize               0                   
    transient_lastDdlTime   1608539877          

# Storage Information        
SerDe Library:          org.apache.hadoop.hive.ql.io.orc.OrcSerde    
InputFormat:            org.apache.hadoop.hive.ql.io.orc.OrcInputFormat  
OutputFormat:           org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat     
Compressed:             No                       
Num Buckets:            -1                       
Bucket Columns:         []                       
Sort Columns:           []                       
Storage Desc Params:         
    field.delim             \t                  
    serialization.format    \t                  
SQL

4. 刪除表

這跟sql中刪除命令drop table是一樣的:

drop table if exists table_name;
SQL

對于管理表(內部表),直接把表徹底刪除了;對于外部表,還需要刪除對應的hdfs文件才會徹底將這張表刪除掉,為了安全,通常hadoop集群是開啟回收站功能的,刪除外表表的數據就在回收站,后面如果想恢復也是可以恢復的,直接從回收站mvhive對應目錄即可。

5. 修改表

大多數表屬性可以通過alter table來修改。

5.1 表重命名

alter table test.user1 rename to test.user3;
SQL

5.2 增、修、刪分區

增加分區使用命令alter table table_name add partition(...) location hdfs_path

alter table test.user2 add if not exists
partition (age = 101) location '/user/hive/warehouse/test.db/user2/part-0000101'
partition (age = 102) location '/user/hive/warehouse/test.db/user2/part-0000102'
SQL

修改分區也是使用alter table ... set ...命令

alter table test.user2 partition (age = 101) set location '/user/hive/warehouse/test.db/user2/part-0000110'
SQL

刪除分區命令格式是alter table tableName drop if exists partition(...)

alter table test.user2 drop if exists partition(age = 101)
SQL

5.3 修改列信息

可以對某個字段進行重命名,并修改位置、類型或者注釋:

修改前:

hive> desc user_log;
OK
userid                  string                                      
time                    string                                      
url                     string                                      
SQL

修改列名timetimes,并且使用after把位置放到url之后,本來是在之前的。

alter table test.user_log
change column time times string
comment 'salaries'
after url;
SQL

再來看表結構:

hive> desc user_log;
OK
userid                  string                                      
url                     string                                      
times                   string                  salaries            
SQL

time -> times,位置在url之后。

5.4 增加列

hive也是可以添加列的:

alter table test.user2 add columns (
birth date comment '生日',
hobby string comment '愛好'
);
SQL

5.5 刪除列

刪除列不是指定列刪除,需要把原有所有列寫一遍,要刪除的列排除掉即可:

hive> desc test.user3;
OK
name                    string                  name                
salary                  float                   salary              
address                 struct<country:string,city:string>    home address        
age                     int                                         

# Partition Information      
# col_name              data_type               comment             

age                     int                                         
SQL

如果要刪除列salary,只需要這樣寫:

alter table test.user3 replace columns(
name string,
address struct<country:string,city:string>
);
SQL

這里會報錯:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cannot drop columns for table test.user3. SerDe may be incompatible

這張test.user3表是orc格式的,不支持刪除,如果是textfile格式,上面這種replace寫法是可以刪除列的。通常情況下不會輕易去刪除列的,增加列倒是常見。

5.6 修改表的屬性

可以增加附加的表屬性,或者修改屬性,但是無法刪除屬性:

alter table tableName set tblproperties(
    'key' = 'value'
);
SQL

舉例:這里新建一張表:

create table t8(time string,country string,province string,city string)
row format delimited fields terminated by '#' 
lines terminated by '\n' 
stored as textfile;
SQL

這條語句將t8表中的字段分隔符'#'修改成'\t';

alter table t8 set serdepropertyes('field.delim'='\t');




作者:柯廣的網絡日志

微信公眾號:Java大數據與數據倉庫