一、hive简介
1、hive中的源数据存储在hdfs中,hive只是解析hdfs中的数据。可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce(映射规约)任务进行运行。
2、Hive:数据仓库。元数据存储在关系型数据库里面。
注:一个hdfs对应多个block,一个block是一个系统文件,默认128m。
二、Hive安装
1、Hive 中 metastore(元数据存储)的三种方式:
a)内嵌Derby方式
b)Local方式:安装mysql--->安装hive--->修改配置(hive-default.xml:hdfs(源数据)-mysql(元数据))--->将mysql的驱动jar包放到hive的lib下--->将hive/lib下的jline-2.12.jar覆盖hadoop_home/share/hadoop/yarn/lib下的jline.jar
源数据:表中的数据存储在hdfs中
元数据:表名、表字段等存储在mysql中
c)Remote方式
三、hql
(一)DDL
1、创建库:create database test;----->hdfs会有一个test.db
2、建表内部表:
create table person( id int, name string, age int, likes array<string>, address map<string,string> )
rowformatdelimitedfieldsterminatedby','
COLLECTIONITEMSTERMINATEDby'-'
mapkeysterminatedby':'
linesterminatedby'\n';
数据如下:
1,zshang,18,game-girl-book,stu_addr:beijing-work_addr:shanghai
2,lishi,16,shop-boy-book,stu_addr:hunan-work_addr:shanghai
3,wang2mazi,20,fangniu-eat,stu_addr:shanghai-work_addr:tianjing
3、删除表:drop table person2; 直接删除了hdfs上的文件
4、内部表:hive既管理元数据,也管理源数据。外部表:hive只管理元数据,不管理源数据。
5、创建外部表:create external table person2(id string, age int) row farmat delimited fields terminated by ',';
5、变更表名:alter table person rename to psn;
6、查看表结构:describe [formatted] person;
(二)DML
1、将外部数据导入hive表中:load data local inpath 'opt/sxt/mytxt' into table person;
同理:hadoop fs -put /opt/sxt/my.txt /user/hive_remote/warehose/person
特点:hive读时检查数据格式,写时不检查
2、查询数据:select * from person; select name, address['stu_addr'] from person;
3、删除数据:删除hdfs中的文件-hadoop fs -rmr /user/hive_remote/warehose/person/my3.txt
4、将hdfs中的数据加载到hive表中:load data inpath '/hivetest/my.txt' into table person;
a、hadoop fs -mkdir /hivetest
b、hadoop fs -put my.txt /hivetest
c、load data inpath '/hivetest/my.txt' into table person;
5、更新数据:update psn set name = 'zs' where id = 1;
注:更新和删除数据要hive开启acid(事务)机制
6、MapReduce计算:select max(money) from person2;------>会启动一个MapReduce做计算(starting job),可以在http://node01:8088/上看到该任务,如图:
注:需要安装yarn:start-yarn.sh
7、插入数据:insert into table staudents values('fred',35,1.28),('barney',32,2.32);
8、将person2中的数据转入到person1中:insert into person1 select id,money from person2;------>会启动一个MapReduce做计算(starting job)
注:insert into是追加;insert overwrite是覆盖。------->使用时机:可以将计算接口存储到新的表中。相当于mysql查询结果存放到了hive中。
9、将hql执行结果存放到本地目录:insert overwrite local directory 'opt/sxt/psn2' row format delimited fields terminated by ',' select * from psn2;
将hql执行结果存放到hdfs:insert overwrite directory 'opt/sxt/psn2' row format delimited fields terminated by ',' select * from psn2;
四、hive分区
(一)说明
1、可在表定义时创建 partition ,也可在以后添加分区
2、一个分区就是一个表目录下的子目录
3、分区分为:单分区和多分区(多层级目录)
(二)hql
1、单分区建表语句:create table day_table(id int, content string) partitioned by (dt string) row format delimited fields terminated by ',';
注:单分区表,按天分区,在表结构中存在 id,content,dt 三列;以dt为文件夹区分
a、加载数据:load data local inpath '/opt/sxt/psn2/p1.txt' into table day_table partition(dt='2021-03-04');
b、查询分区下的数据:select * from day_table where dt='2021-03-04';
2、多分区建表语句:create table ymd_table(id int, content string) partitioned by (year int, month int, day int) row format delimited fields terminated by ',';
注:单分区表,按天分区,在表结构中存在 id,content,dt 三列;以dt为文件夹区分
a、加载数据:load data local inpath '/opt/sxt/psn2/p1.txt' into table ymd_table partition(year=2021, month=03, day=05);
b、查询分区下的数据:select * from day_table where year=2021 and month=03;
3、表已创建,在基础上添加分区:alter table day_table add partition(day int);
注:如果手动创建hdfs上的分区目录,则识别不了这个分区里的数据,因为hive少了分区元数据。需要手动创建分区。
4、修改分区名称:alter table day_table partition(dt='2008-08-08') to partition(dt='2008-08-09');
5、动态分区
a、创建临时表:create table mid_psn(id int, name string, age int, address string) row format delimited fields terminated by ',';
b、创建动态分区表:create table psn5(id int, name string, age int) partitioned by (address string) row format delimited fields terminated by ',';
c、将临时表中的数据加载到分区表: from mid_psn insert into psn5(id , name , age) select id, name, age, address distributed by address;
d、将严格模式(默认)改为非严格模式:set hive.exec.dynamic.partition.mode=nonstrict
五、Hive SerDe 用于做序列化和反序列化。
例:用于正则匹配场景,hive是读时检查
1、hdfs文件中的数据:192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-upper.png HTTP/1.1" 304 -
2、hql:CREATE TABLE logtbl ( host STRING, identity STRING, t_user STRING, time STRING, request STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)" ) STORED AS TEXTFILE;
注:查询出的数据没有中括号和引号,hive的元数据其实就是文件格式的映射
六、自定义函数
1、实现UDF(一进一出)、UDAF(多进一出)、
注:UDTF函数(explode、split)拆分成多行
2、将jar包上传到hive中:add jar
3、创建临时函数:create temporary function tuomin as '类的全限定名'
4、使用自定义函数:select id,age tuomin(date_add('2018-08-08'), 3) from psn6;
七、分桶
1、分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。对于hive中每一个表、分区都可以进一步进行分桶。
2、优点:join时扫描的数据会少很多,前提是两张表的分桶数一样,或为整数倍。
3、抽样:抽取某几个桶中的数据
4、举例:
a、建分桶表:CREATE TABLE psnbucket(id INT, name STRING, age INT) CLUSTERED BY (age) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
b、导入数据:insert into table psnbucket select id, name, age from psn31;
c、抽样查询:select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);
八、Hive Lateral View
1、主要解决在 select 使用 UDTF 做查询过程中,查询只能包含单个 UDTF,不能包含其他 字段、以及多个 UDTF的问题
2、例:
select count(distinct(myCol1)), count(distinct(myCol3)) from psn
LATERAL VIEW explode(likes) myTable1 AS myCol1
LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;
九、视图
1、视图相当于sql的别名
2、例:
a、创建视图:create view myview as select * from psn;
b、查询视图:select columns from myview;
c、删除视图:drop view myview;
十、索引
1、索引是存储在索引表中
2、索引表记录的是索引字段值在文件中的偏移量
3、例:
a、创建索引:create index t1_index on table psn(name) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table t1_index_table;
注:如果不指定默认生成在 default_psn_t1_index表中
b、重建索引(生效):ALTER INDEX t1_index ON psn REBUILD;
c、查询表中有哪些索引:show index on psn;
d、删除索引:DROP INDEX IF EXISTS t1_index ON psn;
十一、运行环境
(一)、hive在cli模式中
1、与hdfs交互:dfs -ls /
2、与linux交互:!pwd
(二)、hive脚本的方式运行
1、hive -e "select * from psn";
2、执行内容输出到文件:hive -e "select * from psn">aaa
3、执行内容输出到文件,没有执行日志:hive -e -S "select * from psn";
4、hive -f psn.sql(sql语句所存放的文件)
注:crontab 中执行的脚本,脚本中的命令要用全路径否则识别不出来。crontab执行日志路径:cd /var/spool/mail/--->vim root
1、安装python
2、算法:机器学习(sklearn:算法库,相当于java第三发的jar包----决策树(分类决策树、回归决策树、逻辑回归等)、支持向量机(做分类的))、
深度学习(tensorflow、pytorch:框架,相当于java的spring, 神经网络:cnn(卷积神经网络-->一般做图像识别、检测等)、rnn(递归神经网络--->一般做语音识别、增强))