一、Hive基本概念
1.1 hive是什么
hive是基于hadoop的一个数仓分析工具,hive可以将hdfs上存储的结构化的数据,映射成一张表,然后让用户写HQL(类SQL)来分析数据
tel up down
1383838438 1345 1567
1383838439 5345 1567
1383838440 1241 16577
1383838441 3453 15757
1383838434 35355 1567567
按照手机号 分组,统计每个手机号的总流量
select tel,up+down from test;
hive的本质其实就是hadoop的一个客户端,hive底层不存储任何数据,hive表的数据存在hdfs上,hive表的元数据存在关系型数据库中
默认是derby,我们不一般不用默认的derby来存,一般都会修改为mysql。
元数据:描述数据的数据
Hive其实就是将用户写的HQL,给翻译成对应的mr模板,然后执行这些mr程序
hive底层执行引擎其实就是MapReduce,mr运行在yarn上
1.2 hive的优缺点
优点:操作简单,采用类sql的语法分析数据,门槛低,大大的降低了大数据分析的难度,通用性高
缺点:不够灵活,机翻粒度比较粗,调优困难。因为底层执行引擎还是mr,所以延迟较高,不能像关系型数据库那样,立马返回结果
并且底层存储是hdfs,不支持随机写,只能追加,所以hive不支持行级别的更新和删除(delete 和 update)
1.3 hive的架构原理
客户端:命令行客户端,jdbc客户端
数据存储:hdfs
底层执行引擎:mr
元数据库:hive将元数据默认存在derby中,我们一般在安装hive的时候,会修改成mysql
dirver四个器
解析器:将hql语句转换成AST抽象语法树,解析sql是否有误
编译器:将解析后的hql编译成逻辑执行计划,暂时不执行
优化器:对逻辑计划进行优化,调优
执行器:将优化后的逻辑计划执行,其实就是翻译成对应的mr程序,在yarn上运行
1.4 hive和关系型数据库对比
hive不是数据库,不是数据库,不是数据库
hive除了查询语言HQL跟SQL很像之外,别的跟数据库再也没有半点相似可言
数据更新 数据规模 执行延迟 底层引擎 数据存储
二、Hive安装
2.1 hive访问
1)通过hive自带的beeline客户端访问
beeline -u jdbc:hive2://hadoop102:10000 -n zjp
- hive脚本访问
hive
2.2 hive交互命令
交互命令使用场景:在shell脚本里面不能人为的进入hive客户端交互写sql,所以要通过hive -e或者-f两个交互参数进行写入
1)hive -e
hive -e "select * from student"
2)hive -f
hive -f stu.sql
2.3 hive参数设置方式
1 通过配置文件设置 (永久生效)
在hive的家目录下面的conf文件夹下的hive-site.xml hive-env.sh hive-log4j2.properties
2 通过命令行参数来设置 (临时生效,只针对当前客户端连接)
hive -hiveconf 参数名=参数值
beeline -u jdbc:hive2://hadoop102:10000 -n atguigu -hiveconf 参数名=参数值
3 通过set命令设置(临时生效,只针对当前客户端连接)
我们连接到hive的客户端以后,可以通过set语句来设置参数
查看所有参数设置
set;
查看单个参数的值
set 参数名;
设置单个参数的值
set 参数名=参数值;
参数设置优先级:
hive-default.xml < hive-site.xml < -hiveconf 参数名=参数值 < set 参数名=参数值
三、数据类型
3.1 基本数据类型
HIVE | MySQL | JAVA | 长度 | 例子 |
---|---|---|---|---|
TINYINT | TINYINT | byte | 1byte有符号整数 | 2 |
SMALINT | SMALINT | short | 2byte有符号整数 | 20 |
INT | INT | int | 4byte有符号整数 | 20 |
BIGINT | BIGINT | long | 8byte有符号整数 | 20 |
BOOLEAN | 无 | boolean | 布尔类型,true或者false | TRUE FALSE |
FLOAT | FLOAT | float | 单精度浮点数 | 3.14159 |
DOUBLE | DOUBLE | double | 双精度浮点数 | 3.14159 |
STRING | VARCHAR | string | 字符系列。可以指定字符集。可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
TIMESTAMP | TIMESTAMP | 时间类型 | ||
BINARY | BINARY | 字节数组 |
利用基本数据类型建表测试
create table test(id int,weight double,name string,money bigint);
利用insert语句按照指定的数据类型插入一条数据
insert into test values(1001,75,"zhangsan",1000000000000);
3.2 集合数据类型
数据类型 | 描述 | 语法示例 |
---|---|---|
STRUCT | 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。2 | struct() 例如 struct<street:string, city:string> |
MAP | MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 | map() 例如map<string, int> |
ARRAY | 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 | Array() 例如array |
测试数据
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing_10010
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing_10011
在hive中建表描述上述数据
create table person(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string,city:string,email:int>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
加载数据
load data local inpath '/opt/module/hive/datas/person.txt' into table person;
查询数据
select * from person;
查出来songsong 这个人的姓名,第一个朋友,孩子xiaoxiao song的年龄,和他的邮编
select name, friends[0],children['xiaoxiao song'],address.email from person where name = "songsong";
select name, friends[1],children['xiao song'],address.street from person;
3.3 类型转换
1)隐式(自动)类型转换
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型。
2)显示(强制)类型转换
CAST( vlaue AS type)
例如:select * from cast('1' as int) + 2;
四、DDL数据定义语言
4.1 库的DDL
1 创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name --指定数据库名称
[COMMENT database_comment] --指定数据库描述
[LOCATION hdfs_path] --指定创建的数据库在hdfs上存储的路径
[WITH DBPROPERTIES (property_name=property_value, ...)]; --指定库的一些属性
案例实操
create database if not exists db_hive
comment "this is my first db"
with dbproperties ("name"="db_hive","owner"="atguigu");
create database if not exists db_hive;
--创建数据库,并指定在hdfs上的路径
create database if not exists db_hive2
location '/db_hive2';
2 查询数据库
show databases;
3 查看数据库详情
--简单查看
desc database 数据库名;
--详细查看 (详细查看可以看到库的属性信息,简单查看看不到)
desc database extended 数据库名;
4 切换数据库
use 数据库名;
5修改数据库
只能修改数据库的属性信息,别的都无法更改。例如:库名,库的存储位置等元数据信息无法更改
alter database db_hive set dbproperties('createtime'='20200624');
6删除数据库
注意:删除掉数据库以后,hdfs上对应的目录也会删除,谨慎操作。
drop database 数据库名 cascade;
--如果数据库不为空,可以在最后加上cascade强制删除
drop database 数据库名 cascade;
--为了更严谨,我们可以在删除之前判断数据库是否存在
drop database if exists 数据库名 cascade;
4.2表的DDL
1创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name --指定表名 【external 外部表/内部表】
[(col_name data_type [COMMENT col_comment], ...)] --指定表的列名,列类型 【列描述】