#博学谷IT学习技术支持#
1.1 在HDFS的默认Hive存储目录创建数据库
create database if not exists myhivetest;
1.2 创建数据库并使用Location关键字指定HDFS存储位置
create database myhivetest2 location '/myhivetest2';
2.1 删除一个空的数据,如果该数据库下存在数据表,则会报错
drop database myhivetest;
2.2 强制删除数据库,如果数据库下存在表,则连同数据表一起删除
drop database myhivetest cascade;
没有被external修饰的是内部表,删除内部表会直接删除元数据及存储数据,因此内部表不适合和其他工具共享数据
create table student
(
No int,
Name string
);
create table student2
(
No int,
Name string
) row format delimited fields terminated by '\t';
create table student3 as
select *
from student2;
create table student4 like student3;
drop table student2;
在创建表的时候通过指定external关键字创建外部表,外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive外部表的时候,数据仍然存放在hdfs当中,不会删掉。
load data [local] inpath '/export/data/datas/student3.txt' [overwrite] |
into table student3 [partition (partcol1=val1)]
1、load data:表示加载数据
2、local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
3、inpath:表示加载数据的路径
4、overwrite:表示覆盖表中已有数据,否则表示追加
5、into table:表示加载到哪张表
6、student3:表示具体的表
7、partition:表示上传到指定分区
Array是数组类型,Array中存放相同类型的数据;
说明:name与locations之间制表符\t分隔,locations中元素之间逗号分隔
create external table hive_array
(
name string,
work_locations array
)
row format delimited fields terminated by '\t'
collection items terminated by ',';
load data local inpath '/export/data/hivedatas/work_locations.txt'
overwrite into table hive_array;
-- 查询所有数据
select *
from hive_array;
-- 查询work_locations数组中第一个元素
select name, work_locations[0] location
from hive_array;
-- 查询location数组中元素的个数
select name, size(work_locations) location_size
from hive_array;
-- 查询location数组中包含tianjin的信息
select *
from hive_array
where array_contains(work_locations, 'tianjin');
map就是描述key-value数据
说明:字段与字段分隔符: “,”;需要map字段之间的分隔符:“#”;map内部k-v分隔符:“:”
create table hive_map
(
id int,
name string,
members map,
age int
)
row format delimited
fields terminated by ','
collection items terminated by '#'
map keys terminated by ':';
load data local inpath '/export/data/hivedatas/hive_map.txt'
overwrite into table hive_map;
select *
from hive_map;
-- 根据键找对应的值
select id, name, members['father'] father, members['mother'] mother, age
from hive_map;
-- 获取所有的键
select id, name, map_keys(members) as relation
from hive_map;
-- 获取所有的值
select id, name, map_values(members) as relation
from hive_map;
-- 获取键值对个数
select id, name, size(members) num
from hive_map;
-- 获取有指定key的数据
select *
from hive_map
where array_contains(map_keys(members), 'brother');
-- 查找包含brother这个键的数据,并获取brother键对应的值
select id, name, members['brother'] brother
from hive_map
where array_contains(map_keys(members), 'brother');
说明:字段之间#分割,第二个字段之间冒号分割
create table hive_struct
(
ip string,
info struct
)
row format delimited
fields terminated by '#'
collection items terminated by ':';
load data local inpath '/export/data/hivedatas/hive_struct.txt'
into table hive_struct;
select *
from hive_struct;
-- 根据struct来获取指定的成员的值
select ip, info.name
from hive_struct;
1、使用普通的insert语法插入数据,由于该方式会调用到MapReduce,所以效率较低,不建议使用
insert into table score3 partition (dt = '2022-10-01')
values ('001', '002', 100);
2、(推荐)使用insert+select的方式添加数据,效率较高
insert overwrite table score4 partition (dt = '2022-10-01')
select sid, cid, sscore
from score;
3、(推荐)通过load data的方式,将文件中的数据添加到Hive中
load data local inpath '/export/data/hivedatas/score.txt'
overwrite into table score5 partition (dt = '2022-10-01');
4、从已存在的表中获取表结构以及数据,从而达到新建表的效果
create table score5 as
select *
from score;
5、(推荐)创建外部表,使用location关键字从HDFS中获取数据
create external table score6
(
sid string,
cid string,
sscore int
)
row format delimited fields terminated by '\t' location '/myscore6';
6、原先已经存在数据表结构的前提下,将文档中的数据添加到HDFS相对于的位置,从而达到添加数据的效果
hadoop fs -put stu.txt /user/hive/warehouse/myhive.db/stu
7、(推荐)使用sqoop导入数据到Hive中
sqoop框架将数据直接导入hive