写在前面
吃水不忘挖井人
视频课地址:https://www.bilibili.com/video/BV1W4411B7cN?from=search&seid=3089375730995965944&spm_id_from=333.337.0.0
学习参考书籍:
书中内容需要拥有hive和hadoop的基础,通读一遍感觉还需要在实际工作中翻读,但是也算有些收获
Hive学习笔记
环境变量的配置
sudo vim /etc/profile.d/my_env.sh
加入信息:
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
source一下
source /etc/profile.d/my_env.sh
查看日志可用的方法:tail -f xxx
查阅正在改变的日志文件
ctrl+z
可以将进程暂时挂起,fg
可以切换回来
基本的查看操作:
show tables;
show databases;
hive打印当前库,表头:在hive-site.xml中加入
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
show create tables xxx;
显示建表语句
基本概念
本质上是将HQL转化为MapReduce程序
Hive处理的数据存储在HDFS,分析数据的底层实现是MapReduce,执行程序运行在Yarn中
优点:
类SQL语法,快速上手
不用写MapReduce
可以处理大数据场景
支持自定义函数
缺点:
HQL表达能力有限,无法达到更高效率
效率比较低,执行延迟高,调优困难
架构
- 用户接口Client:CLI,JDBC(访问hive),WebUI(浏览器访问hive)
- 元数据Meta store:包括表名,表所属的数据库,表的拥有者,列/分区字段,表类型,表数据所在目录
- Hadoop:使用HDFS进行存储,使用MapReduce进行计算
- 驱动器Driver:
- 解析器SQL Parser 将SQL抽象为语法树;
- 编译器Physical plan 将AST编译生成逻辑执行计划;
- 优化器 Query Optimizer 对逻辑执行计划进行优化;
- 执行期Execution 把逻辑计划换为可以运行的物理计划(MR/Spark)
运行机制
客户提交SQL作业到HiveServer(driver驱动器),HiveServer会根据用户提交的SQL作业及数据库中现有的元数据信息生成一份可供计算引擎执行的计划(例如若干mapreduce任务)。
Hive将所有的MapReduce任务提交给Yarn,Yarn创建MapReduce任务来完成。Yarn创建的子任务会与HDFS进行交互,获取数据,最终将结果写入HDFS或本地
Hive和数据库比较
查询语言:类似
数据更新:hive针对数据仓库,读多写少,hive不建议对数据改写,一定要改写,需要将数据取出,然后修改,覆盖写入;数据库可以任意更改
执行延迟:hive没有索引,需要扫描整个表,开启MapReduce需要较高延迟
数据规模:Hive大,数据库小
为什么不用derby
Hive默认元数据库是derby,开启hive后就会占用元数据库,不与其他客户端共享数据,所以我们需要将hive元数据地址改为MySQL
hive参数配置
查看当前配置
hive>set;
hive>set mapred.reduce.tasks;
以下这三种方式优先级逐级递增,配置文件<命令行参数<参数声明
配置文件:
默认配置文件 hive-default.xml
自定义配置文件 hive-site.xml
命令行参数:
在hive目录下:bin/hive -hiveconf mapred.reduce.tasks=10;
这样修改的参数仅仅在本次hive中有效
参数声明方式:
hive (default)> set mapred.reduce.tasks=100;
Hive数据类型
hive中的String是一个可变的字符串,不能声明最多存多少个字符
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
举例:
hive (default)> select friends[1],children['xiao song'],address.city from test where name="songsong";
OK
_c0 _c1 city
lili 18 beijing
Time taken: 0.076 seconds, Fetched: 1 row(s)
DDL数据定义
可以直接使用hdfs的put功能,将数据传入表中,但是要主要建表时候的分割语句
hive(default)> dfs -put ./xxx.txt /target_menu
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
查看数据库
显示数据库
hive> show databases like 'db_hive*';
OK
db_hive
db_hive_1
显示数据库信息
hive> desc database extended db_hive;
OK
db_hive hdfs://hadoop102:9820/user/hive/warehouse/db_hive.db
atguiguUSER
切换数据库
hive (default)> use db_hive;
删除数据库
hive> drop database if exists db_hive2;
如果想强行删除有数据的数据库
hive> drop database db_hive2 cascade;
drop删除后,external表的元数据被删除,但是hdfs中external表的数据仍然存在
创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[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]
[ROW FORMAT row_format]
[STORED AS file_format]