你会Hive表的基本操作吗?

大数据
create table语句遵从sql语法习惯,只不过Hive的语法更灵活。例如,可以定义表的数据文件存储位置,使用的存储格式等。

[[381808]]

本文转载自微信公众号「Java大数据与数据仓库」,作者柯同学。转载本文请联系Java大数据与数据仓库公众号。   

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; 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

没有指定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; 
  • 1.

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          
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

也可以加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            
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.

4. 删除表

这跟sql中删除命令drop table是一样的:

drop table if exists table_name; 
  • 1.

对于管理表(内部表),直接把表彻底删除了;对于外部表,还需要删除对应的hdfs文件才会彻底将这张表删除掉,为了安全,通常hadoop集群是开启回收站功能的,删除外表表的数据就在回收站,后面如果想恢复也是可以恢复的,直接从回收站mv到hive对应目录即可。

5. 修改表

大多数表属性可以通过alter table来修改。

5.1 表重命名

alter table test.user1 rename to test.user3; 
  • 1.

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' 
  • 1.
  • 2.
  • 3.

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

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

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

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

5.3 修改列信息

可以对某个字段进行重命名,并修改位置、类型或者注释:

修改前:

hive> desc user_log; 
OK 
userid                  string                                       
time                    string                                       
url                     string             
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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

alter table test.user_log 
change column time times string 
comment 'salaries' 
after url; 
  • 1.
  • 2.
  • 3.
  • 4.

再来看表结构:

hive> desc user_log; 
OK 
userid                  string                                       
url                     string                                       
times                   string                  salaries             
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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

5.4 增加列

hive也是可以添加列的:

alter table test.user2 add columns ( 
birth date comment '生日'
hobby string comment '爱好' 
); 
  • 1.
  • 2.
  • 3.
  • 4.

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               
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

如果要删除列salary,只需要这样写:

alter table test.user3 replace columns( 
name string, 
address struct<country:string,city:string> 
); 
  • 1.
  • 2.
  • 3.
  • 4.

这里会报错:

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 
  • 1.

这张test.user3表是orc格式的,不支持删除,如果是textfile格式,上面这种replace写法是可以删除列的。通常情况下不会轻易去删除列的,增加列倒是常见。

5.6 修改表的属性

可以增加附加的表属性,或者修改属性,但是无法删除属性:

alter table tableName set tblproperties( 
    'key' = 'value' 
); 
  • 1.
  • 2.
  • 3.

举例:这里新建一张表:

create table t8(time string,country string,province string,city string) 
row format delimited fields terminated by '#'  
lines terminated by '\n'  
stored as textfile; 
  • 1.
  • 2.
  • 3.
  • 4.

这条语句将t8表中的字段分隔符'#'修改成'\t';

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

 

责任编辑:武晓燕 来源: Java大数据与数据仓库
相关推荐

2019-05-07 15:49:27

AI人工智能艺术

2010-07-13 10:40:30

唐骏

2021-08-19 15:36:09

数据备份存储备份策略

2010-09-03 12:20:54

数据库

2021-06-04 09:09:05

FlutterFuchsia操作系统

2020-10-26 15:18:01

大数据APP软件

2024-03-29 12:50:00

项目分层模型

2022-03-15 08:36:46

递归查询SQL

2021-04-14 06:53:52

C# 修饰符 Public

2021-04-16 15:02:11

CAP理论分布式

2024-02-22 08:31:26

数据恢复工具MySQL回滚SQL

2012-06-20 10:47:25

Team Leader

2012-06-20 15:01:25

iOS开发

2023-02-27 10:45:16

2019-05-29 13:59:03

GitHub开源搜索功能

2012-04-24 09:54:14

WiFi

2021-09-13 07:23:52

Go Set 设计

2023-12-04 07:09:53

函数递归python

2023-08-29 09:31:01

Scrapy网页爬虫
点赞
收藏

51CTO技术栈公众号