Hive的数据类型
Hive的基本数据类型
Hive的复杂数据类型
复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下表所示:
Hive的表库操作
Hive的数据库操作
Hive中数据库的概念本质上仅仅是表的一个目录或者命名空间。然而,对于具有 很多组和用户的大集群来说,这是非常有用的,因为这样可以避免表命名冲突。
如果用户没有使用use关键字显示指定数据库,那么将会使用默认的数据库default。
查看数据库
show databases;
使用like关键字实现模糊匹配
show databases like 'hive_*';
使用数据库
use 数据库名称;
创建数据库
create database 数据库名;
删除数据库
drop database 数据库名;(这种删除,需要将对应数据库中的表全部删除后才能删除数据库)
drop database 数据库名 cascade;(强制删除,自行删除所有表)
查看数据库的描述
desc database 数据库名;
Hive的数据表操作
显示数据库中的表
show tables;
使用like关键字实现模糊匹配
show tables like 'hive_*';
显示表的详细信息
desc [formatted] hive_01;(加上formatted显示的更详细)
创建数据表(与MySQL类似)
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]
上述字段解释说明:
create table
external关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(location)。
comment为表和列添加注释
partitioned by创建分区表
clustered by创建分桶表
sorted by
row format
delimited [fields terminated by char]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char] | SERDE serde_name [WITHSERDEPROPERTIES(property_name=property_value,
property_name=property_value, ...)]
- fields terminated by char 列分隔符
- COLLECTION ITEMS TERMINATED BY char 集合元素直接的分隔符
- MAP KEYS TERMINATED BY char map集合KV的分隔符
- 用户在建表的时候可以自定义SerDe或者使用自带的SerDe,如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe,在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
8:stored as指定存储文件类型
SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本 不指定默认)、RCFILE(列式存储格式文件)、ORCFILE(行列压缩存储文件)
STORED AS TEXTFILE。如果数据是二进制文件,使用 STORED AS SEQUENCEFILE,如果数据需要压缩请使用 STORED AS RCFILE 或
textfile
sequencefile
rcfile
orcfile
location指定在HDFS上的存储位置
like允许用户复制表的结构,但不复制数据。
#使用数据库
use text;
#创建表
create table [if not exists] test(
id int,
name string,
hobby array<string>
address map<string,string>
)row format delimited
fileds terminated by ' '
connection items terminated by ':'
map keys terminated by '~'
#默认stored as储存文件类型是textfile
#load加载数据(只有textfile类型的表才可以使用load)
load data local inpath '/usr/test/movies.dat' overwrite into table movie
#创建不同的文件储存类型
create table [if not exists] test1(
id int,
name string,
hobby array<string>
address map<string,string>
)
stored as orcfile;
#除了textfile类型的储存方式都得用insert加载数据
insert overwrite table test1 select * from test;
序列化器SerDe
//创建新表 指定SerDe 为RegexpSerDe正则
use b01;
create table reg_table(
id int,
name string
) row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties('input.regex'="id=(.*),name=(.*)"); //.代表单个字符 * 0~N次
//加载数据
load data local inpath '/usr/local/hive_data/regexp_test' overwrite into table reg_table;
//创建user用户数据的指定JSON的序列化器
create table user_json_textfile(
uid string,
phone string,
addr string
) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe';
load data local inpath '/usr/local/xl_project/user/user_login_info.json' overwrite into table user_json_textfile;
Hive内部表&&外部表
未被external修饰的是内部表(managed table),被external修饰的为external table)
内外部表的区别:
- 内部表数据由Hive管理,外部表数据由HDFS管理
- 内部表的数据的存储位置是hive.metastore.warehouse.dir ,默认为/user/hive/warehouse中,外部表的数据存储位置由自己指定。
- 删除内部表中的数据会直接删除元数据及存储数据;删除外部表仅仅会删除元数据,HDFS上的数据并不会被删除;
- 对内部表的修改会将修改直接同步给元数据;而对外部表的表结构和分区进行修改,则需要MSCK REPAIR TABLE table_name(将HDFS上的元数据信息写入到metastore);
//创建外部表
create external table outter_table(
id int,
name string,
hobby array<string>,
address map<string,string>
)row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/outter/data'
//向外部表中载入数据
load data local inpath '/usr/local/person' into table outter_table;
Hive表的修改操作
表重命名
Alter table 旧名称 RENAME to 新名称;
alter table person rename to person_info;
修改列信息
Alter table 表名 CHANGE [COLUMN] 列名 新列名 数据类型
[COMMENT 注释文本]
[AFTER 字段名称|FIRST];
//修改列名称
alter table test1 change name tename string;
//修改列类型
alter table test1 change id id string;
//指定列位置
alter table test1 change id id string first;
这里会遇到类型兼容的问题,看下表:
Hive数据类型之间的隐式转换
增加列
Hive能将新的字段添加到已有字段之后
Alter table 表名 ADD COLUMNS(
列名 字段类型 [COMMENT ‘注释’],
........
);
//增加列(可以一次添加多个)
alter table test1 add columns(
img string,
addr string
)
删除或替换列
Alter table 表名 REPLACE COLUMNS(
列名 字段类型 [COMMENT ‘注释’],
............
);
//删除替换列
alter table test1 replace columns(
id string,
name string,
age string
)
修改表的存储属性
Alter table表名 SET FILEFORMAT (TEXTFILE|SEQUENCEFILE|RCFILE|ORCFILE)
会出现严重问题:(TEXTFILE的数据无法直接向RCFILE和ORCFILE导入,由于RCFILE
与ORCFILE都是以块状存储数据,我们只能通过insert语句导入到一个ORCFILE或RCFILE的新表中)。快对快,行对行
//修改表的存储结构
alter table test1 set fileformat sequencefile
设置表的注释
alter table 表名 set tblproperties('属性名'='属性值');
//设置表的注释
alter table test1 set tblproperties('comment'='测试表')
修改表的分隔符
alter table 表名 set serdeproperties('属性名'='属性值');
//修改表的分隔符
alter table test1 set serdeproperties('field.delim'='~')
查看表的详细的建表语句
Show create table 表名;
//展示创建表的详细信息
show create table test1
修改表的serde_class
//修改表的序列化器
alter table test1 set serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties ("input.regex" = "id=(.*),name=(.*),age=(.*)");
Hive添加jar包
add JAR '/usr/local/hive_data/hive-hcatalog-core-2.3.5.jar'(存放jar路径和jar名称)
Hive的分区操作
hive开发中,在存储数据时,为了更快地查询数据和更好地管理数据,都会对hive表中数据进行分区存储。所谓的分区,在hive表中体现的是多了一个字段。而在底 层文件存储系统中,比如HDFS上,分区则是一个文件夹,或者说是一个文件目录,不同的分区,就是数据存放在根目录下的不同子目录里,可以通过show partitions查看。
静态分区
//创建静态分区表
create table test_partition (
id string comment 'ID',
name string comment '名字')
comment '测试分区'
partitioned by (year int comment '年')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' ;
insert语句:
//插入分区表数据(静态分区)
insert into table test_partition partition(year=2000) values(1,'小明');
insert into table test_partition partition(year=1999) values(2,'小红');
insert into table test_partition partition(year=2000) values(3,'小兰');
insert into table test_partition partition(year=1998) values(4,'小紫');
load语句:
load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018);
load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018);
load data local inpath '/usr/local/part_test' into table test_partition partition (year =2017);
动态分区
动态分区默认不开启,需要使用下列语句开启:
set hive.exec.dynamic.partition.mode=nonstrict;#需退出hive,重新进入执行
//创建动态分区
create table test_partitions (
id string comment 'ID',
name string comment '名字',
year int comment '年'
)comment '测试'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
insert语句:
insert into table test_partitions partition(year) values(5,'小白',2016);
insert into table test_partitions partition(year) values(6,'小黑',2016);
load语句:
load data local inpath '/usr/local/part_test' into table test_partitions partition (year);
修改分区
指定到新分区目录下 原始分区仍旧存在 但是后续插入的新记录会存储到新分区中
alter table test_partitions partition(year=2016) set location '/user/hive/warehouse/new_part/b01.db/test_partition/year=2016';
删除分区
alter table test_partitions drop partition(year=2016);
同步到关系型数据库中的元信息
MSCK REPAIR TABLE test_partitions;
分桶表
分桶表描述
分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash 值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
//先设置一下分桶的权限
set hive.enforce.bucketing=true;
//创建分桶表
use test;
create table student_bck
(id int, name string)
clustered by (id) sorted by (id desc) into 3 buckets
row format delimited fields terminated by ",";
//插入数据
insert overwrite table student_bck select id,name from test_partition;
//查询分桶数据
select * from student_bck tablesample(bucket 3 out of 3 on id);
tablesample (bucket x out of y on id);
# x表示从哪个桶(x-1)开始,y代表分几个桶,也可以理解分x为分子,y为分母,及将表分为y份(桶),取第x份(桶)