1.概念:Hive由Facebook开源,用于解决海量结构化日志的数据统计。
Hive是基于Hadoop的一个==数据仓库工具==,可以将==结构化的数据文件映射为一张表==,并提供类SQL查询功能。
本质是:==将Hive SQL转化成MapReduce程序==
学好HIVE可以做数据仓库开发
2.HIVE架构
hive没有队列的概念,只是把我们的程序写好后就提交。 YARN有队列的概念(谁先提交就运行谁的任务)
HIVE实操
3.1 Hive JDBC服务
netstat -nlp命令查看运行了哪些服务和端口
4、Hive的DDL操作(20分钟)
4.1 hive的数据库DDL操作
4.1.1、创建数据库
hive >createdatabase db_hive;
或者
hive >createdatabase ifnotexists db_hive;
数据库在HDFS上的默认存储路径是==/user/hive/warehouse/*.db==
4.1.2、显示数据库
hive> show databases;
4.1.3、查询数据库
hive> show databaseslike'db_hive*';
4.1.4、查看数据库详情
hive>descdatabase db_hive;
4.1.5、显示数据库详细信息
hive>descdatabase extended db_hive;
4.1.6、切换当前数据库
hive > use db_hive;
4.1.7、删除数据库
#删除为空的数据库
hive>dropdatabase db_hive;
#如果删除的数据库不存在,最好采用if exists 判断数据库是否存在
hive>dropdatabase if exists db_hive;
#如果数据库中有表存在,这里需要使用cascade强制删除数据库
hive>dropdatabase if exists db_hive cascade;
4.2 hive的表DDL操作
4.2.1 、建表语法介绍
CREATE[EXTERNAL]TABLE[IFNOTEXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONEDBY(col_name data_type [COMMENT col_comment], ...)] 分区
[CLUSTEREDBY(col_name, col_name, ...) 分桶
[SORTEDBY(col_name [ASC|DESC], ...)]INTOnum_buckets BUCKETS]
[ROW FORMAT row_format] row format delimited fields terminatedby“分隔符”
[STOREDASfile_format]
[LOCATION hdfs_path]
4.2.1.1、Hive是一种建立在Hadoop文件系统上的数据仓库架构,并对存储在HDFS中的数据进行分析和管理;
(也就是说对存储在HDFS中的数据进行分析和管理,我们不想使用手工,我们建立一个工具把,那么这个工具就可以是hive)
4.2.1.2、 hive建表语法中的分隔符设定
ROW FORMAT DELIMITED 分隔符设置开始语句
FIELDS TERMINATED BY:设置字段与字段之间的分隔符
COLLECTION ITEMS TERMINATED BY:设置一个复杂类型(array,struct)字段的各个item之间的分隔符
MAP KEYS TERMINATED BY:设置一个复杂类型(Map)字段的key value之间的分隔符
LINES TERMINATED BY:设置行与行之间的分隔符
例:有以下格式的数据创建出合适的表结构,并将数据导入表中
战狼2,吴京:吴刚:卢婧姗,2017-08-16
大话西游,周星驰:吴孟达,1995-09-01
create table t_movie(movie_name string,actors array<string>,first_date date)
row format delimited
fields terminated by ','
collection items terminated by ':'
;
4.2.1.3、load 语法
按照建表要求,新建一个movie.txt文件
(终端输入pwd查看文件路径,overwrite是覆盖表中原内容)
LOAD语句:load data [local] inpath 'filepath' [overwrite]
into table tablename [partition (partcol1=val1,partcol2=val2...)]
--将/root/data下的所有数据文件导入t3表中,并且覆盖原来的数据
load data local inpath '/root/data/' overwrite into table t3;
--将HDFS中 /input/student01.txt 导入到t3
load data inpath '/input/student01.txt' overwrite into table t3;
--将数据导入分区表
load data local inpath '/root/data/data1.txt' into table partition_table partition(gender='M');
4、hive 语句区分大小写
4.2.1.4 查询出每个电影的第二个主演
select movie_name,actors[1],first_datefromt_movie;
6.2.2 、字段解释说明
create table:创建一个指定名字的表
EXTERNAL :创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),指定表的数据保存在哪里
COMMENT: 为表和列添加注释
PARTITIONED BY: 创建分区表
CLUSTERED BY: 创建分桶表
SORTED BY: 按照字段排序(一般不常用)
ROW FORMAT: 指定每一行中字段的分隔符row format delimited fields terminated by ‘\t’
STORED AS:指定存储文件类型:
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
LOCATION: 指定表在HDFS上的存储位置。
4.2.3、 创建内部表
1、直接建表
使用标准的建表语句
create table if not exists student(
id int,
name string
)
row format delimited fields terminated by'\t'
stored as textfile;
2、查询建表法
通过AS 查询语句完成建表:将子查询的结果存在新表里,有数据
create table if not exists student1 as select id, name from student;
3、like建表法
根据已经存在的表结构创建表
create table if not exists student2 like student;
4、查询表的类型
hive >desc formatted student;
6.2.4、 创建外部表
create external table if not exists default.emp(
id int,
name string,
age int
)
row format delimited fields terminated by '\t'
location '/hive/bigdata';
创建外部表的时候需要加上==external== 关键字
location字段可以指定,也可以不指定
指定就是数据存放的具体目录
不指定就是使用默认目录 ==/user/hive/warehouse==
6.2.5、 内部表与外部表的互相转换
1、内部表转换为外部表
#把student内部表改为外部表
alter table student set tblproperties('EXTERNAL'='TRUE');
2、外部表转换为内部表
#把student管理表改为外部表
alter table student set tblproperties('EXTERNAL'='FALSE');
6.2.6、 内部表与外部表的区别
1、建表语法的区别
外部表在创建的时候需要加上==external==关键字
2、删除表之后的区别
内部表删除后,表的元数据和真实数据都被删除了
外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期还是可以恢复出来
hive cli命令窗口查看本地文件系统
与操作本地文件系统类似,这里需要使用 ! (感叹号),并且最后需要加上 ;(分号)
例如
!ls /;
hive cli命令窗口查看HDFS文件系统
与查看HDFS文件系统类似
dfs -ls / ;
hive的底层执行引擎有3种
mapreduce(默认)
tez(支持DAG作业的计算框架)
spark(基于内存的分布式计算框架)