查看表的完整建表语句
当我们使用 create table test
可以创建一张表时,很多参数 hive 帮助我们配置成了默认参数。
如果想查看该表所有配置参数的完整建表语句,可以使用以下SQL:
show create table test;
返回结果为:
CREATE TABLE `test`(
`id` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat' -- MR操作时的InputFormat
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' -- MR操作时的OutputFormat
LOCATION
'hdfs://hadoop102:8020/user/hive/warehouse/test' -- 该表在HDFS上的存储路径
TBLPROPERTIES (
'bucketing_version'='2',
'transient_lastDdlTime'='1660101789') -- 最后一次DDL的时间等属性
类似的,其他DDL也可以进行show
查看完整命令:
show create database hive;
数据库操作
创建数据库
语法格式:
-- IF NOT EXISTS 先判断是否已经存在,不存在时才创建
create database [IF NOT EXISTS] database_name
-- 注释
[COMMENT database_comment]
-- 指定该表在hdfs上的存储位置,默认路径为:/user/hive/warehouse/数据库名称.db/
-- 在该数据库中创建表时,表的默认存储路径就是:/user/hive/warehouse/数据库名称.db/表名/
[LOCATION hdfs_path]
-- 创建时间、作者等其他属性
[WITH DBPROPERTIES (property_name=property_value, ...)]
示例:
create database if not exists db_hive;
查询数据库
显示所有数据库名称:
show databases;
过滤显示查询的数据库名称:
-- 查询以hive开头的数据库
show databases like 'hive*';
查询指定数据库的信息:
-- 查询hive数据库的信息
desc database hive;
返回数据库的相关信息:
db_name comment location owner_name owner_type parameters
hive hdfs://hadoop102:8020/user/hive/warehouse/hive.db tengyer USER
查询指定数据库的详细信息:
desc database extended hive;
这里查询的其实就是元数据库中的元数据信息,所以也可以直接在 Mysql 元数据库中进行查询:
select * from DBS;
切换数据库
使用use
在不同数据库之间进行切换:
use hive;
修改数据库
用户可以使用 ALTER DATABSE
命令为某个数据库的 DBPROPERTIES
设置键值对属性值,来描述这个数据库的属性信息:
alter database hive set dbproperties('createtime'='20200101');
查看修改结果:
desc database extended hive;
删除数据库
删除空的数据库:
drop database hive;
如果删除的数据库无法确定是否存在,最好加上 if exists
判断:
drop database if exists hive;
如果数据库不为空,可以加上 cascade
级联强制删除:
drop database hive cascade;
表操作
创建表
建表语句
语法格式:
-- EXTERNAL:外部表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
-- 字段 字段类型 字段注释
[(col_name data_type [COMMENT col_comment], ...)]
-- 表注释
[COMMENT table_comment]
-- 分区表
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
-- 分桶表 指定分组字段、桶个数
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
-- 数据行格式:列分隔符、换行符等
[ROW FORMAT row_format]
-- 指定文件格式:文本文件、压缩文件等
[STORED AS file_format]
-- 表的存储位置
[LOCATION hdfs_path]
-- 表的其他属性
[TBLPROPERTIES (property_name=property_value, ...)]
-- 从另一张表查询结果创建表
[AS select_statement]
管理表(内部表)
默认创建的表都是管理表,有时也称为内部表。我们平时创建(不带external
关键字)的表都是内部表。
因为这种表,Hive会(或多或少)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项 hive.metastore.warehouse.dir
所定义的目录的子目录下。
当我们删除一个管理表时,Hive也会删除这个表中的数据。管理表不适合和其他工具共享数据。 即:Mysql元数据库中的元数据信息、Hdfs上的数据文件夹和数据文件都会被删除。
可以通过元数据库中的TBLS
表的TBL_TYPE
字段判断该表是否是管理表(MANAGED_TABLE
)。
create table test(id string);
外部表
当表创建时指定为external
外部表时,Hive并非认为其完全拥有这份数据。
删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。也即:只删除 Mysql 元数据库中存储的元数据信息,不删除 hdfs 上的数据文件内容。
create external table test4(id string);
例如:每天将收集到的网站日志,定期流入HDFS文本文件中,在Hive中创建外部表,可以做一些统计分析,将最后分析的结果使用Hive内部表进行存储,分析过程中,使用 select
+ insert
插入内部表中。
管理表和外部表的互相转换
查看表的类型:
-- 查看表的信息,其中Table Type是表的类型
desc formatted test4;
修改内部表为外部表:
-- 将内部表test4转换为外部表,需要注意EXTERNAL大小写
alter table test4 set tblproperties('EXTERNAL'='TRUE');
修改外部表为内部表:
-- 将外部表转换为内部表
alter table test4 set tblproperties('EXTERNAL'='FALSE');
指定分隔符等数据行格式
示例:
create table test3(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string, city:string>
)
-- 数据行的格式定义
row format delimited
-- 字段间分隔符
fields terminated by ','
-- 数组集合类型的多个元素之间分隔符
collection items terminated by '_'
-- map的keyvalue之间分隔符
map keys terminated by ':'
-- 换行符,默认的就是\n
lines terminated by '\n';
修改表
重命名表
重命名表语法:
ALTER TABLE table_name RENAME TO new_table_name;
修改字段信息
更新列:
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name
column_type [COMMENT col_comment] [FIRST|AFTER column_name]
增加和替换列:
-- ADD 新增一个字段,字段位置在所有列后面(partition列前)
-- REPLACE 替换表中所有字段
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
删除表
删除表
内部表:删除表时,元数据和hdfs数据文件全都删除
外部表:只删除元数据
drop table test;