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大数据与数据仓库