「基础」SQL-Hive中常用的表格操作(下)

2021-05-18 10:04:50 浏览数 (1)

今天我们来讲讲Hive中常用的表格修改的操作。

Hive系列文章预计10-20篇,主要讲数据分析中最基础的SQL技能。

01-表的重命名

执行语句:

代码语言:javascript复制
alter table oldname rename to new_name;

下面我们将建好的表t_od_use_cnt重命名为t_od_use_cnt_new,然后再改回来。

运行效果如下:

代码语言:javascript复制
hive> set hive.cli.print.current.db=true;
hive (default)> use app;
OK
Time taken: 0.896 seconds

hive (app)> show tables;
OK
t_od_use_cnt
Time taken: 0.569 seconds, Fetched: 1 row(s)

hive (app)> alter table t_od_use_cnt rename to t_od_use_cnt_new;
OK
Time taken: 0.697 seconds

hive (app)> show tables;
OK
t_od_use_cnt_new
Time taken: 0.039 seconds, Fetched: 1 row(s)

hive (app)> alter table t_od_use_cnt_new rename to t_od_use_cnt;
OK
Time taken: 0.393 seconds

hive (app)> show tables;
OK
t_od_use_cnt
Time taken: 0.043 seconds, Fetched: 1 row(s)

02-重命名字段 & 数据类型 & 注释

执行语句:

代码语言:javascript复制
alter table tablename change column_old_name column_new_name new_type
[comment 'XXX'];

t_od_use_cnt中的user_id字段本来是bigint类型的,注释为用户id。

下面我们试着将user_id重命名为id,数据类型改为string类型,注释改为ID,然后再改回来。运行效果如下:

代码语言:javascript复制
hive (app)> desc t_od_use_cnt;
OK
platform              string                平台 android,ios      
app_version           string                app版本               
user_id               bigint                用户id                
use_cnt               int                   当日使用次数              
is_active             tinyint               是否活跃                
date_8                int                   日期                  

# Partition Information      
# col_name              data_type             comment             

date_8                int                   日期                  
Time taken: 0.119 seconds, Fetched: 11 row(s)

hive (app)> alter table t_od_use_cnt change user_id id string          
          > comment 'ID';
OK
Time taken: 0.365 seconds

hive (app)> desc t_od_use_cnt;
OK
platform              string                平台 android,ios      
app_version           string                app版本               
id                    string                ID               
use_cnt               int                   当日使用次数              
is_active             tinyint               是否活跃                
date_8                int                   日期                  

# Partition Information      
# col_name              data_type             comment             

date_8                int                   日期                  
Time taken: 0.173 seconds, Fetched: 11 row(s)

hive (app)> alter table t_od_use_cnt change id user_id bigint 
          > comment '用户id';
OK
Time taken: 0.138 seconds

hive (app)> desc t_od_use_cnt;
OK
platform              string                平台 android,ios      
app_version           string                app版本               
user_id               bigint                用户id                
use_cnt               int                   当日使用次数              
is_active             tinyint               是否活跃                
date_8                int                   日期                  

# Partition Information      
# col_name              data_type             comment             

date_8                int                   日期                  
Time taken: 0.103 seconds, Fetched: 11 row(s)

03-增加列

执行语句:

代码语言:javascript复制
alter table tablename add columns (
col_name1 datatype comment 'xxx',
col_name2 datatype comment 'xxx',
...) cascade;

通过此命令可以增加任意多个新列,每加一个列用逗号断开,comment子句是可选的。下面来演示一下实际使用,我们对表t_od_use_cnt 加入两个新列test1,test2,数据类型都是string,注释为‘测试’,运行效果如下:

代码语言:javascript复制
hive (app)> alter table t_od_use_cnt  add columns (
          > test1 string comment '测试',
          > test2 string comment '测试') cascade;
OK
Time taken: 0.742 seconds
hive (app)> desc t_od_use_cnt;
OK
platform              string                平台 android,ios      
app_version           string                app版本               
user_id               bigint                ID                  
use_cnt               int                   当日使用次数              
is_active             tinyint               是否活跃                
test1                 string                测试                  
test2                 string                测试                  
date_8                int                   日期                  

# Partition Information      
# col_name              data_type             comment             

date_8                int                   日期                  
Time taken: 0.214 seconds, Fetched: 13 row(s)

04-删除 & 替换列

Hive中并没有直接删除列的命令,但可以通过replace命令删除之前的所有字段并重新制定新的所有字段,以此达到删除字段的效果,命令如下:

代码语言:javascript复制
alter table table_name replace columns 
(col_name1 data_type [comment 'xxx'],
col_name2 data_type [comment 'xxx'],
...);

下面我们将上一步新加的两个test列删除掉,实际是将所有字段全部删掉,用新的字段代替旧的字段。不过alter语句只能改变元数据,如果该字段本身有数据存在,那么并不会将该字段下的数据一起删掉,可以理解为只删掉了列名。运行效果如下:

代码语言:javascript复制
hive (app)> alter table t_od_use_cnt replace columns (
          >       platform string comment '平台 android,ios'
          >       ,app_version string comment 'app版本'
          >       ,user_id bigint comment '用户id'
          >       ,use_cnt int comment '当日使用次数'
          >       ,is_active tinyint comment '是否活跃'
          >       );
OK
Time taken: 0.328 seconds
 
hive (app)> desc t_od_use_cnt;
OK
platform              string                平台 android,ios      
app_version           string                app版本               
user_id               bigint                用户id                
use_cnt               int                   当日使用次数              
is_active             tinyint               是否活跃                
date_8                int                   日期                  
      
# Partition Information      
# col_name              data_type             comment             
      
date_8                int                   日期                  
Time taken: 0.146 seconds, Fetched: 11 row(s)

05-删除分区

有时我们需要删除表中的部分分区数据,而不是删除整个表的数据。

命令如下:

代码语言:javascript复制
ALTER TABLE table_name DROP IF EXISTS PARTITION (col_name='xxx');

0 人点赞