Hive表的基本操作(必会)
Hive系列文章
Hive表的基本操作
Hive中的集合数据类型
Hive动态分区详解
hive中orc格式表的数据导入
Java通过jdbc连接hive
通过HiveServer2访问Hive
SpringBoot连接Hive实现自助取数
hive关联hbase表
Hive udf 使用方法
Hive基于UDF进行文本分词
Hive窗口函数row number的用法
数据仓库之拉链表
1. 创建表
create table
语句遵从sql
语法习惯,只不过Hive
的语法更灵活。例如,可以定义表的数据文件存储位置,使用的存储格式等。
create table if not exists test.user1(
name string comment 'name',
salary float comment 'salary',
address structstring, city:string> comment 'home address'
)
comment 'description of the table'
partitioned by (age int)
row format delimited fields terminated by '\t'
stored as orc;
没有指定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;
3. 查看表结构
通过desc [可选参数] tableName
命令查看表结构,可以看出拷贝的表test.user1
与原表test.user1
的表结构是一样的。
hive> desc test.user2;
OK
name string name
salary float salary
address struct home address
age int
# Partition Information
# col_name data_type comment
age int
也可以加formatted
,可以看到更加详细和冗长的输出信息。
hive> desc formatted test.user2;
OK
# col_name data_type comment
name string name
salary float salary
address struct 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
4. 删除表
这跟sql
中删除命令drop table
是一样的:
drop table if exists table_name;
对于管理表(内部表),直接把表彻底删除了;对于外部表,还需要删除对应的hdfs
文件才会彻底将这张表删除掉,为了安全,通常hadoop
集群是开启回收站功能的,删除外表表的数据就在回收站,后面如果想恢复也是可以恢复的,直接从回收站mv
到hive
对应目录即可。
5. 修改表
大多数表属性可以通过alter table
来修改。
5.1 表重命名
alter table test.user1 rename to test.user3;
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'
修改分区也是使用alter table ... set ...
命令
alter table test.user2 partition (age = 101) set location '/user/hive/warehouse/test.db/user2/part-0000110'
删除分区命令格式是alter table tableName drop if exists partition(...)
alter table test.user2 drop if exists partition(age = 101)
5.3 修改列信息
可以对某个字段进行重命名,并修改位置、类型或者注释:
修改前:
hive> desc user_log;
OK
userid string
time string
url string
修改列名time
为times
,并且使用after
把位置放到url
之后,本来是在之前的。
alter table test.user_log
change column time times string
comment 'salaries'
after url;
再来看表结构:
hive> desc user_log;
OK
userid string
url string
times string salaries
time -> times
,位置在url
之后。
5.4 增加列
hive
也是可以添加列的:
alter table test.user2 add columns (
birth date comment '生日',
hobby string comment '爱好'
);
5.5 删除列
删除列不是指定列删除,需要把原有所有列写一遍,要删除的列排除掉即可:
hive> desc test.user3;
OK
name string name
salary float salary
address struct home address
age int
# Partition Information
# col_name data_type comment
age int
如果要删除列salary
,只需要这样写:
alter table test.user3 replace columns(
name string,
address structstring,city:string>
);
这里会报错:
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'
);
举例:这里新建一张表:
create table t8(time string,country string,province string,city string)
row format delimited fields terminated by '#'
lines terminated by '\n'
stored as textfile;
这条语句将t8表中的字段分隔符'#'修改成'\t';
alter table t8 set serdepropertyes('field.delim'='\t');