是一个基于hadoop的数据仓库工具,可以将结构化数据映射成一张数据表,并提供类SQL的查询功能。
背景:hadoop是个好东西,但是学习难度大,成本高,坡度陡。
意义(目的):降低程序员使用hadoop的难度。降低学习成本。
存储使用HDFS存储
计算使用MapReduce进行计算。
1、扩展性 : Hive的扩展性与集群的扩展性相同
2、延展性:Hive支持用户自定义函数,编写符合自己业务需求的函数。
3、容错性:节点出现问题(宕机/断电)SQL仍可完成执行。
每次的执行开销较大,任务运行时间较长,延时较高。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFnCeRc9-1574339077403)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574126259456.png)]
元数据:描述数据的数据(属性)
表名称、字段名,字段的数据类型。
内部执行流程
解释器 -> 编译器 -> 优化器 -> 执行器
列分隔符(通常为空格、”\t”、”\x001″)
行分隔符(”\n”)
读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。
Hive在加载数据的过程就是拷贝数据的过程,不需要特定的转化。不会对数据本身进行任何修改,甚至不会对数据进行扫描。
Hive 中不支持对数据的改写和添加(对文本内数据的添加),
Hive 在加载数据的过程中不会对数据中的某些 Key 建立索引。所以Hive不适合在线数据查询(要求相应速度快)。
总结:hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析。
可支持Text,
SequenceFile,
ParquetFile,
ORC格式
RCFILE等
DB、数据库
Table,内部表
External Table,外部表
Partition,分区
Bucket,分桶
1、derby版hive直接使用
每个节点自己维护自己的元数据库(derby),导致多个节点之间元数据不共享。
2、mysql共享hive元数据
2.1安装mysql
mysq不推荐使用RPM安装,建议使用yum进行安装
yum install -y mysql mysql-server mysql-devel
/etc/init.d/mysqld start
配置远程连接(root 只用123456密码)
grant all privileges on . to ‘root’@’%’ identified by ‘123456’ with grant option;
配置mysql用户 root 密码是123456
update user set password=password(‘123456’) where user=‘root’;
2.2 安装HIve
现在第一个节点解压hive的安装包。
在解压后的目录conf中修改配置文件
hive-env.sh
配置HADOOP_HOME
配置HIVE_CONF_DIR
hive-site.xml
添加连接Mysql的配置
将解压后的文件夹拷贝到其他节点
配置环境变量
将mysql-connector-java-5.1.38.jar 上传到HIVE的lib目录下。
1、在Hive客户端,配置hive到环境变量的前提下,在节点的任意位置 直接数据hive + 回车
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oTpfahRV-1574339077404)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574208461234.png)]
2、
启动hiveserver2 服务
hive --service hiveserver2
进行连接
进入beelin的shell窗口
连接hiveserver2服务
!connect jdbc:hive2://node01:10000
输入root 和密码 123456
0: jdbc:hive2://node01:10000>
0: jdbc:hive2://node01:10000>
0: jdbc:hive2://node01:10000> show databases;
±---------------±-+
| database_name |
±---------------±-+
| default |
| myhive |
±---------------±-+
hive -e ‘操作命令’
hive -e ‘show databases;’
hive -f 文件名(文件内是操作命令)
hive -f test.sql
1、数据库的增删改查
增 : create database [ if not exists ] myhive ;
删 : drop database myhive ; (数据库内没有表可以删除,有表不能删除)
改 :数据库不允许修改
查 :show databases;
查看详细信息:
desc database myhive2;
desc database extended myhive2;
数据库的切换:
use myhive(数据库名);
自定义hive数据库的路径:create database myhive2 location ‘/myhive2’;
创建基本数据表(内部表):
create table tableName(字段名称 字段类型,字段名称 字段类型)
create table tableName(字段名称 字段类型,字段名称 字段类型)
ROW FORMAT DELIMITED IELDS TERMINATED BY char (char分隔符)
指定数据中字段与字段的分隔符 ‘\t’ 或 ‘,’ 或 ‘|’ 或其他
创建外部数据表:
create EXTERNAL table tableName(字段名称 字段类型,字段名称 字段类型)
建外部表需要指定数据的存储路径。通过LOCATION进行指定。
在删除内部表时:内部表删除将表的元数据和数据同时删除。
在删除外部表时:外部表的元数据被删除,数据本身不删除。
drop table tablename;
alter tablename ***
show tables;
desc tablename;
基本数据类型
INT BIGINT FLOAT DOUBLE DEICIMAL STRING VARCHAR CHAR
BINARY TIMESTAMP DATE INTERVAL ARRAY
复杂数据类型
MAP STRUCT UNION
create table stu3 as select * from stu2; 复制数据复试表结构
create table stu4 like stu2; 不复制数据复试表结构。
从linux中加载数据到hive
load data local inpath ‘数据路径’ into table 表名;
从hdfs中加载数据到hive,并覆盖
load data inpath ‘数据路径’ overwrite into table 表名;
create external table techer (t_id string,t_name string) row format delimited fields terminated by ‘\t’;
加载数据
load data local inpath ‘/export/servers/hivedatas/techer .csv’ into table techer ;
在hdfs查看表中的数据
hadoop fs -ls /user/hive/warehouse/myhive.db/techer
在hive中查询
select * from techer
删除数据表techer
drop table techer;
再次查看
hadoop fs -ls /user/hive/warehouse/myhive.db/techer(数据依然存在)
create table student(t_id string,t_name string) row format delimited fields terminated by ‘\t’;
加载数据
load data local inpath ‘/export/servers/hivedatas/student .csv’ into table student;
在hdfs查看表中的数据
hadoop fs -ls /user/hive/warehouse/myhive.db/student
在hive中查询
select * from student
删除数据表techer
drop table student;
再次查看
hadoop fs -ls /user/hive/warehouse/myhive.db/student(数据不存在)
企业常见的分区规则:按天进行分区(一天一个分区)
创建分区表的语句
create table score(s_id string,c_id string,s_score int) partitioned by (month string) row format delimited fieldsterminated by ‘\t’;
create table score2 (s_id string,c_id string,s_score int) partitioned by (year string,month string,day string) row formatdelimited fields terminated by ‘\t’;
数据加载
load data local inpath ‘/opt/hive/score.csv’ into table score partition (month=‘201806’);
load data local inpath ‘/opt/hive/score.csv’ into table score2 partition(year=‘2018’,month=‘06’,day=‘02’);
特别强调:
分区字段绝对不能出现在数据表以有的字段中。
作用:
将数据按区域划分开,查询时不用扫描无关的数据,加快查询速度。
是在已有的表结构之上新添加了特殊的结构
开启hive的桶表功能
set hive.enforce.bucketing=true;
设置桶(reduce)的个数
set mapreduce.job.reduces=3;
建分桶表
create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by ‘\t’;
创建基本表
create table course_common (c_id string,c_name string,t_id string) row format delimited fields terminated by ‘\t’;
基本表添加数据
load data local inpath ‘/export/servers/hivedatas/course.csv’ into table course_common;
在基本表中查询数据插入到分桶表
insert overwrite table course select * from course_common cluster by(c_id);
确认分桶内的数据
[root@node01 hive]# hadoop fs -cat /user/hive/warehouse/course/000000_0
03 英语 03
[root@node01 hive]# hadoop fs -cat /user/hive/warehouse/course/000001_0
01 语文 02
[root@node01 hive]# hadoop fs -cat /user/hive/warehouse/course/000002_0
02 数学 01
特别强调:
分桶字段必须是表中的字段。
分桶逻辑:
对分桶字段求哈希值,用哈希值与分桶的数量取余,余几,这个数据就放在那个桶内。
分桶的作用和好处
1、对于join的需求,能够起到优化加速的作用。(前提是,join字段设置为分桶字段)
2、用于数据取样(获取/提取数据样本)
将数据编号作为分桶字段。这样每个桶内各种“级别”的数据都有。
函数查看
show functions;
show function 函数名 ;
desc function extended upper;
UDF UDAF UDTF
一进一出 多进一出 一进多出
1、创建一个class 继承UDF
2 编写evaluate函数,在这里编写业务需求需要的代码
3 打成jar包,并上传
4 将jar包添加到hive
在hive shell 内 add jar 路径+jar包
5 创建临时函数(永久的函数将temporary 删掉)
create temporary function 新的函数的名称 as 业务代码所在的包名-类名;
6 调用 验证;
select reflect('第一个参数','第二个参数','第三个参数');
第一个参数: java代码包名加类名
第二个参数: java代码方法名
第三个参数: 需要传递的参数