Hive:
sql on hadoop
用途:
1.sql
2.udf
hadoop:
hdfs: 命令行、api
yarn: 提交作业 (mr spark flink) on yarn
mapreduce: 编程 核心类 思想
mr弊端:
1.开发大量代码
2.业务变更,修改代码不方便
大数据处理,最终落地最好是SQL:
大数据开发两个角度:
1.基础平台 涉及底层面较广
2.应用层面开发 写sql
如何选择:兴趣点+公司定位
3.对sql 不友好
mr :批处理 离线计算
由于mr的弊端=》产生了hive
hive:
1.官网 hive.apache.org
2.谁提出来的:Facebook开源,去解决海量结构化数据的统计问题
3.hive是什么 :构建在hadoop上的数据仓库
hdfs: hive的数据是在hdfs上的
yarn:hive的作业是跑在yarn上的
mapreduce: hive的作业可以以mr的方式去运行
4.如何使用呢
1.定义了一个类 sql语言==》 类似sql
2.适用于批处理、离线计算
3.hive就是写sql => mr作业 =》 yarn上运行
hive引擎:
mr: 把sql转变成 mr作业去运行
tez: sql =>tez
spark : sql =>spark
hive on spark :hive的引擎选用的是spark
spark on hive : 使用sparksql去连接 hive去查询
4.hive 数据存储 压缩、文件存储格式
1.
2.
3.版本 x.y.z
x: 大版本
y:小版本
z: 小版本bug的修复
hive介绍:
1.为什么学习hive 简单易学
2.扩展性好:
1.udf
2.hadoop
3.metastore
hive架构:
client:主要负责sql
driver:sql解析、逻辑优化、物理执行计划
引擎:
数据:
作业:
元数据:
hive部署:
常见问题:(面试)
hive与mysql的区别:
1.共同点:都使用sql语言
2.延时性:hive 慢 hive与mysql属于两个范畴,使用场景不同
3.事务:都支持 大数据场景下不使用
4.sql语法:
hive:建议使用: insert into table
select * from
不建议使用:update delete
insert into table values();
5.分布式:理论上都支持,hive可以借助hadoop完成分布式部署
6.数据体量:hive要远大于mysql mysql几T数据就不太行
部署步骤:
上传安装包并解压 [hadoop@digdata22 software]$ tar -zxvf ./apache-hive-3.1.3-bin.tar.gz -C ~/app
软连接 ln -s apache-hive-3.1.3-bin hive
环境变量 [hadoop@digdata22 app]$ vim ~/.bashrc
#HIVE_HOME
export HIVE_HOME=/home/hadoop/app/hive
export PATH=${HIVE_HOME}/bin:${PATH}
生效:[hadoop@digdata22 app]$ source ~/.bashrc
启动:
1.初始化 不是说所有的版本都需要初始化
cdh
apache
schematool -dbType derby -initSchema
修改元数据库
[hadoop@digdata22 conf]$ cp hive-default.xml.template hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.10.4/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
导入mysql驱动
/home/hadoop/app/hive/lib mysql-connector-java-8.0.21.jar
初始化
schematool -dbType mysql -initSchema
-----------------------------------------------------------------------------------------
1.查看版本 :
去元数据库查看:
mysql> select * from VERSION ;
2.创建一张表
hive> create table shuke_student(name string);
插入数据
hive> insert into table shuke_student values ('yangle'),("zhangsan");
//hive中数据存储在hdfs上
思考:
表中的数据存在哪里?
TBLS 【表信息】
hdfs://bigdata22:9000/user/hive/warehouse
1. DB_ID: 1
hive:
数据: hdfs
hdfs://bigdata22:9000/user/hive/warehouse
元数据:MySQL
TBLS 【表信息】
DBS 【库信息】
COLUMNS_V2 【表中字段】
hive 里面的表 =》 会被拆分成 N 表
/user/hive/warehouse/shuke_student【shuke_student 对应hdfs路径】
查找日志:
[hadoop@bigdata22 conf]$ vim hive-log4j2.properties
property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name} //在 cd /tmp/hadoop/里面有hive.log
property.hive.log.file = hive.log
改变日志路径:[hadoop@bigdata22 hive]$ mkdir logs /home/hadoop/app/hive
[hadoop@bigdata22 conf]$ vim hive-log4j2.properties
property.hive.log.dir = /home/hadoop/app/hive/logs/
hive的配置:
配置参数:【终端】
hive.cli.print.header //显示头信息 列名 表名
hive.cli.print.current.db //hive (default)>
hive.metastore.warehouse.dir 【hive default(默认)库表 数据存放路径】
配置参数:
hive-site.xml : 【hive 配置文件】 =》 全局配置
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
如何查看 参数的默认值?
set key; [查看] hive (default)> set hive.metastore.warehouse.dir;
hive.metastore.warehouse.dir=/user/hive/warehouse
set key=value [设置] set hive.cli.print.current.db=false;
配置hive参数 优先级:
1.hive-site.xml 全局配置
2.会话中设置 【】 //set key=value,仅仅当前会话生效
3.hive
hive --hiveconf hive.cli.print.current.db=false; [当前会话生]
hive 命令行:
-e sql // hive -e "select * from default.shuke_student"
-f sql文件 // [hadoop@bigdata22 hive]$ hive -f ./1.sql
-i hive初始化一些操作【udf】
hive -e "select * from default.shuke_student"
hive -f xx.sql
crotab
azkaban
xxl
dl
3.语法:
DDL:
Data Definition Language //定义表定义库
database: hive默认有一个数据库 default :/user/hive/warehouse
在hive中:1.database、table对应hdfs上 文件夹、目录
2.分区也对应文件夹
3.桶对应文件
databa
table table table
分区
桶
1.创建数据库
CREATE [REMOTE] (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment] //自己增加路径
[LOCATION hdfs_path] //自己指定存储的位置
[MANAGEDLOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
[] 可有可无
(|) 选择其中一个即可
... 多个
create database bigdata_hive;
bigdata_hive: 在hdfs上的路径
/user/hive/warehouse/bigdata_hive.db
database 在hdfs上的路径:
默认数据库: default
/user/hive/warehouse
非默认数据库:
/user/hive/warehouse/dbname.db 网页上 bigdata22:9870
create database IF NOT EXISTS bigdata_hive;
create database bigdata_hive2 LOCATION '/data/bigdata_hive2'; //自己指定存储的位置
mysql> select * from DBS \G; //查看数据库位置 hdfs://bigdata22:9000/data/bigdata_hive2 http://bigdata22:9870/
create database bigdata_hive3 COMMENT 'it is a bigdata_hive3 database'
WITH DBPROPERTIES ('create_user'='sxwang','create_time'='2099-05-01');
修改数据库:
1.数据库 名字不要动
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...); -- (Note: SCHEMA added in Hive 0.14.0)
alter database bigdata_hive3 SET DBPROPERTIES('create_time'='2033');
hive里面数据:
1.数据: hdfs
2.元数据: mysql
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
drop database bigdata_hive3;
drop database bigdata_hive3 CASCADE; //强行删除
hive table:
列的数据类型:
data_type
: primitive_type
| array_type
| map_type
| struct_type
| union_type
primitive_type:
1数据类型:
int 整型
bigint [long] 长整型
float 单精度
double 双精度
decimal 精度更多
2.字符串:
STRING 字符串
3.日期:
DATE yyyy-mm-dd
TIMESTAMP yyyy-mm-dd hh:mm:ss => 毫秒数 bigint
创建表:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)
[AS select_statement];
create table student(
id int ,
name string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
show tables;
1.插入表中数据:
1.insert into table values(''); [不要用] =》 mr
insert into table as select xxx from xx ;
2.load : 加载数据
1.本地
2.hdfs 上数据
3.覆盖数据 =》 update
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
本地:【数据不会丢失】
load data local inpath '/home/hadoop/data/student.txt' into table student ;
hdfs:[input 数据没了]
load data inpath '/data/student.txt' into table student ;
hive =》 ods层 load
日志数据 =》 flume =》 hdfs =》etl(spark) => hdfs =》load data =》 hive
日志数据 =》 flume =》 hdfs =》etl(spark) =》 hive
日志数据 =》 flume =》 hive
本地:
load data local inpath '/home/hadoop/data/student.txt' OVERWRITE into table student ;
table:
每天的数据:
没有分区:
19 20 21
insert :
1.insert into values
2.insert into table sql
insert into/OVERWRITE TABLE student01 select * from student;
建表:
1.create ()
2.create table student01 like student; 【仅仅拿表结构】
3. create table student02 as sql ; [mr] [临时查询 adhoc ]
清空表数据:
1.drop table
2.truncate
删除某条数据:
1.update delete
=》 load insert 数据覆盖的方式 来更新数据
table:
分区:
sql:
1.function :
聚合
etl
2.udf
3.数组
4.开窗
5.join union 子查询
6.案例分析 =》
查sql
7.行转列 列转行
case when
explode
insert OVERWRITE tabl xxx partittion (dt='20220520')
select
xxx,
dt
from xx
insert OVERWRITE tabl xxx partittion (dt)
select
xxx,
'20220520' as dt
from xx
insert OVERWRITE tabl xxx partittion (dt)
select
xxx,
dt
from xx
文件存储格式:
行式
列式
文件压缩格式:
gzip
bzip2
snappy
lzo
调优:
1.数据倾斜:
group by
join
2.解决:
udf key 打散
join:
大小表问题:
mapjoin
reduce join []
3.数据跑的慢 ,没有数据倾斜 ?
拆分sql
条件筛选:
4.explain =》 不用
xxl sqoop flume [2-3] kafka spark => 离线数仓 、平台【 同步工具】 【实时同步平台】
hive [1]
hive [1.5]
hive [3-4]
hive :
select :
create table p_user(
id int ,
name string ,
age int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
load;
load data local inpath '/home/hadoop/data/p_user.txt' into table p_user;
1.where 【条件过滤】
column < > = and or in not in between .. and
2.order by 排序 [全局排序]
注意; mapreduce
影响: reduce输出的时候 只有一个 reduce task 处理排序
asc
desc
Order, Sort, Cluster, and Distribute By 【排序】
input => map => reduce => output
order by => 全局排序
1 =》
1 1 =》 1 order =》 1
1 1 1
电影类广告的收益 :
1 100
2 200
3 50
3.like 模糊匹配 regexp rlike
where name =""
1.% 模糊
2._ 占位
select * from xx where name REGEXP 'xxx|yyy|zzz|ttt'
4.合并表
1.union
2.union all
5.null
where
is is not
etl:
脏数据: column 值 是 null 'null' '' 'NULL' =>
1.etl
2.过滤掉
String =》 'unkown'
数值:=》 0
处理空值的函数:
ifnull
nvl
coalesce
6.聚合函数
group by + 聚合函数
sum
count
max
min
avg
7.join
inner join
left join
right join
full join
join:
reduce 没有 【map join 】
map reduce => join
table :
1.种类:
1.管理表/内部表 | 外部表
2.普通表| 分区表
CREATE [EXTERNAL] TABLE
普通表:
内部表:
CREATE TABLE
外部表:
CREATE EXTERNAL TABLE
1.内部表 | 外部表 区别:
1.内部表:
1.删表: hdfs上的数据 被删除 + 元数据里面的数据 也被删除
2.外部表:
1.删表:元数据里面的数据 也被删除
使用场景:
1.外部表 一般不用【不用】
2.生产上不会有删表 操作
【重新创建一个】
内部表:
CREATE TABLE student_manager(
`id` int,
`name` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
load data local inpath '/home/hadoop/data/student.txt' into table student_manager;
外部表:
CREATE EXTERNAL TABLE student_extenal(
`id` int,
`name` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
load data local inpath '/home/hadoop/data/student.txt' into table student_extenal;
删表:
内部表:
删表: hdfs上的数据 被删除 + 元数据里面的数据 也被删除
外部表:
删表: 元数据里面的数据 也被删除
表备份:
hive: hadoop01 a => 数据迁移 hadoop02
drop table a;
外部表:
hive -f xxx.sql => xxl => T+1
hive:
ods
dwd ttl 7天
dws ttl 7天
rpt
alter table drop parition (dt=''); =>xxx.sql
普通表| 分区表:
1.普通表:
CREATE EXTERNAL TABLE student_extenal(
`id` int,
`name` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
2.分区表:
1.hive中的分区就是分目录【对比mR 分区】
/user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990503/
/user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990502/
/user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990501/
2.提升查询效率
1.普通表:
/user/hive/warehouse/bigdata_hive.db/student_extenal/表中数据 【03 02 01】
2.分区表:
/user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990503/表中数据
/user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990502/表中数据
/user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990501/表中数据
select * from where dt='03';
普通表:
分区表:
CREATE EXTERNAL TABLE student_extenal_p(
`id` int,
`name` string)
PARTITIONED BY (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
load data local inpath '/home/hadoop/data/student.txt' into table student_extenal_p;
load data local inpath '/home/hadoop/data/student.txt' into table student_extenal_p PARTITION(dt='20990520');
load data local inpath '/home/hadoop/data/student.txt' into table student_extenal_p PARTITION(dt='20990522');
查数据:
查看table 有多少个分区:
show parititions xx ;
删除分区 :
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
alter table student_extenal_p drop PARTITION(dt='__HIVE_DEFAULT_PARTITION__');
日志数据 =》 flume =》 hdfs =》etl(spark) => hdfs =》load data
mv =》 hive
日志数据 =》 flume =》 hive
hive:
日志表有了:
hdfs: 0520 数据
load
hadoop fs -mv xxx / /table/dt='0520'
hive:
paritition :
dt='0520'
load :
load data inpath '/data/student.txt' into table student_extenal_p PARTITION(dt='20990530');
关联元数据:
1.MSCK REPAIR TABLE student_extenal_p;
【不要用】
2.ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
hdfs:
1.mkdir
2.mv flume
3.查不到
3.关联元数据
ALTER TABLE student_extenal_p ADD PARTITION(dt='20990601');
分区表插入数据:
1.load =》 几乎不用
ods =》不用
2.insert into/OVERWRITE tablename parition (dt='')
ods 分区表dt
dwd 分区表dt
静态分区:
动态分区:
1.
input : 19 20 21 ==> hive
动态分区=》 sql
静态分区=》 3个sql
CREATE EXTERNAL TABLE student_extenal_p(
CREATE EXTERNAL TABLE student_extenal_p2(
`id` int,
`name` string)
PARTITIONED BY (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
静态分区:
insert OVERWRITE table student_extenal_p2 partition(dt='20990520')
select
id ,
name
from student_extenal_p
where dt='20990520';
动态分区:
set hive.exec.dynamic.partition.mode=nonstrict;
insert OVERWRITE table student_extenal_p2 partition(dt)
select
id ,
name,
dt
from student_extenal_p
where dt='20990520';
insert OVERWRITE table student_extenal_p2 partition(dt)
select
id ,
name,
'20990520' as dt
from student_extenal_p
where dt='20990520';
input : 19 20 21 ==> hive
动态分区:
insert OVERWRITE table student_extenal_p2 partition(dt)
select
id ,
name,
dt
from student_extenal_p
where dt in ("20990521","20990522","20990530");
静态分区:
insert OVERWRITE table student_extenal_p2 partition(dt='20990521')
select
id ,
name
from student_extenal_p
where dt='20990521';
insert OVERWRITE table student_extenal_p2 partition(dt='20990522')
select
id ,
name
from student_extenal_p
where dt='20990522';
数仓:
xxx.sql:
set hive.exec.dynamic.partition.mode=nonstrict;
insert OVERWRITE table student_extenal_p2 partition(dt)
select
id ,
name,
dt
from student_extenal_p
where dt='var_dt';
shell:
dt= sed -i 's/var_dt/${dt}/g' xxx.sql
0520:
hive -f xxx.sql 0520
teple.sql:
set hive.exec.dynamic.partition.mode=nonstrict;
insert OVERWRITE table student_extenal_p2 partition(dt)
select
id ,
name,
dt
from student_extenal_p
where dt='var_dt';
cat teple.sql >> ${dt}.sql
sed -i 's/var_dt/${dt}/g' ${dt}.sql
hive -e "sql "
练习题:
https://blog.csdn.net/GodSuzzZ/article/details/106935523?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-29-106935523.pc_agg_new_rank&utm_term=hive%E9%80%89%E6%8B%A9%E9%A2%98&spm=1000.2123.3001.4430