Hive表库基本操作
Hive的数据类型
Hive的基本数据类型
Hive的复杂数据类型
复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下表所⽰:
Hive的表库操作
Hive的数据库操作
Hive中数据库的概念本质上仅仅是表的⼀个⽬录或者命名空间。然⽽,对于具有很多组和⽤户的⼤集来说,这是⾮常有⽤的,因为这样可以避免表命名冲突。
如果⽤户没有使⽤use关键字显⽰指定数据库,那么将会使⽤默认的数据库default。
查看数据库
show databases;
使⽤like关键字实现模糊匹配
show databases like 'hive_*';检索以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]
上述字段解释说明:
1: create table创建⼀个指定名字的表,如果相同名字的表已经存在,则抛出异常;⽤户可以使⽤ IF NOT EXISTS来规避这个异常。 2: external关键字可以让⽤户创建⼀个外部表,在建表的同时指定⼀个指向实际数据的路径(location)。
3: comment为表和列添加注释
4: partitioned by创建分区表
5: clustered by创建分桶表
6: sorted by排序
7: 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 或 STORED AS ORCFILE
textfile存储空间消耗⽐较⼤,并且压缩的text ⽆法分割和合并查询的效率最低,可以直接存储,加载数据的速度最⾼。
sequencefile存储空间消耗最⼤,压缩的⽂件可以分割和合并需要通过text⽂件转化来加载。
rcfile存储空间⼩,查询的效率⾼,需要通过text⽂件转化来加载,加载的速度最低
orcfile存储空间最⼩,查询的最⾼,需要通过text⽂件转化来加载,加载的速度最低。
9:location指定在HDFS上的存储位置
10: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(''="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管理
内部表的数据的存储位置是astore.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 ‘注释’],
........
);
hive 字符串转数组//增加列(可以⼀次添加多个)
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'='测试表')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论