HIVE
首先搞清楚学习的目标,明确自己的动力源
hive是什么?
hive库和表的操作?
hive高级函数用法?
实际工作中写impala sql,
而使用hive操作大数据其实就是写hive sql,
hive是建立在hadoop基础上的数据仓库 基础架构 它提供一系列工具,
进行ETL操作
Hive SQL 来操作hadoop数据 HQL
允许开发者开发自定义的mapreduce任务来处理内建的
sql函数
hive中含有sql解析引擎,将sql -> mr job
hive的数据存储在HDFS上
无专门的数据存储格式,默认TextFile,还支持
SequenceFile\RCFile等
hive的构成包含
用户接口:cli shell(命令行交互工具操作)\web UI(浏览器操作)\JDBC (java程序操作),
driver(优化器、编译器、执行器 核心,用于将hivesql翻译【从语法、词法分析到编译,优化以及生成一个】成查询计划 mr job),
注意:如果是 select * 操作,不需要使用mr,直接在hdfs中查询对应的文件即可;
metastore 管理元数据信息,默认自带derby存储引擎,但不支持多用户,故推荐外接mysql;
有了hive以后,不需要用java写复杂的mr程序去操作大数据了,简化成用简单的sql就能完成;
数据库 VS 数据仓库
数据库是OLT(transaction)P面向联机事务处理,支持增删改查操作,一般用于记录日常的活动,交易事件以及信息
用户更关系响应时间、数据的安全性、完整性
数据仓库是OLA(anayltical)P面向主题的,集成的,历史的,面向联机分析处理的,支持管理决策,原则上只支持查询操作
下载安装hive时注意看hadoop的版本,hive 2.x.y 对应 hadoop 2.x.y (3.x.y对应3.x.y)
apache的所有软件下载归档网站: archive.apache.org/dist/hive
下载解压安装包 tar -zxvf
hive是hadoop的客户端工具,故不一定要安装在集群节点中
可以放在任意一个集群客户端节点上都可
修改配置文件:
apache-hive-.../conf/hive-env.sh.template...
mv hive-env.sh.template... hive-env.sh 环境变量 找 hive hadoop java 的位置
hive-site.xml 配置hive中各组件的信息:
元数据-外接mysql存储引擎-通过JDBC连接
交互-JDBC配置
core-site.xml 配置客户端连接的一些信息,如有权限的
用户及用户组
初始化metastore- mysql
schematool -dbtype myssql -initSchema
也就是说 hive 的元数据信息是存放在mysql当中,
而真正的数据还是存放在hdfs中
hive操作 通过两种方式:
1shell 《1》通过 /bin/hive.sh 直接连接
《2》通过 /bin/beeline 通过JDBC连接 hiveserver2服务再与hive交互 间接连接
bin/hive -e 'select * from f1'
bin/beeline -e 'select * from f1' 使用beeline前先启动hiveserver2服务 bin/hiveserver2
-e 启动一个客户端去执行
-u url 指定连接的ip和端口
2JDBC 写java代码 使用driver类 配置connect对象 进行连接并操作
hive set命令使用:
相当于配置hive-site.xml里面的配置信息,可以在hive命令行中直接输入 set hive.cli.current.db=true; 只对当前会话有效;
若在~/.hiverc中设置,则对当前用户有效;
若在hive-site.xml中设置则全局有效;
hive日志配置:
conf/下有两个log4j配置文件模版,分别是hive和hadoop的日志配置文件,改后缀变成配置文件后,先改日志级别从INFO改为WARN,
看mapreduce执行任务的日志在8088端口的页面上查看;
hive 创建表(指定列和行的分隔符):
create table t1{
id int comment'',
name varchar(20) comment''
}row format delimited fields terminated by '\t' lines terminated by '\n';
行格式 为 delimited 字段 分隔符 为 '\t' 行 分隔符 为 '\n'
查看表信息:
desc t1; --查看表中的字段信息
show create table t1; --查看建表语句及储存信息
修改表名:
alter table t1 rename to t1_bak;
默认是hdfs中的一个目录 /usr/hive/warehouse/t2_bak
故hive中的表在hdfs中 实际是一个文件目录
具体的数据文件是 t2_bak.data
而分区是子目录
hive 表操作
load data local【本地】 inpath '指定路径' into table 表名;
也可直接将数据文件直接上传到hdfs相应文件目录中,可自动识别为表
hdfs dfs -put '本地输入路径' 'hdfs输出路径'
加载数据:
使用 insert overwrite/into t1 () partition()select * from
t1 在命令行操作中不常用,
load data inpath '' into table t1 ;
批量加载数据更为方便
表增加字段及注释:
alter table t1 add columns cardno varchar(10) comment'';
删除表:
drop table t1;
注意hive的一些特性:
1)若不指定分隔符,hive不主动识别使用的分隔符,或造成加载进去的数据全为NULL值的情况;
2)就算使用的分隔符不对,hive也不会报错,也就是说hive不检查文件分隔符等加载格式,
故会出现加载成功,但数据不正确的情况;
linux 将大文件分割成小文件:
使用split命令
split -l 指定分割成的每个小文件的行数
如 split -l 10000
split -b 指定分割成的每个小文件的字节数
split -d 使用数字后缀
split -d -a length 前缀名 同时可以使用-a来指定后缀的长度和前缀名
综合:
split -l 1000 b.txt -d -a 3 file_split
-d 添加数字后缀
cat h* >> h1.txt
Diff -r h.txt h1.txt
hive复合数据类型的使用:
array 数组 适合 一个字段中存放多个值的情况
create table a (
id int,
favors array
指定集合中元素的数据类型
)row format delimited
collection items terminated by ','
集合 中的 每个元素 分隔符为 ,
fields terminated by '\t'
lines terminated by '\n';
select favors[0] from a;
map键值对 map
struct 像java里的对象
类似存储了多个map键值对 ,区别在于map更灵活,占更多空间
struct反之。
表类型:
内部表:hive默认类型,表数据默认存储在/user/hive/warehouse目录中
外部表:链接 删除它只是删除这个链接(元数据),不会对实际数据造成影响
不存放在warehouse目录底下,但还是存放在hdfs根目录下的某个地方,location指定
常用外部表,因为先有数据放进hdfs后建表,相当于建立了一个映射关系
create external table t1 (
id int
)location '/data/external';
内外部表转换:
alter table t1 set tblproperties('external'='true/false');
其本质是是否将数据文件放入warehouse目录底下
*内部表删除分区时,会删除分区文件夹及数据文件
--将文本文件数据加载到hive表 底层存储在HDFS
load data local inpath '' into table t1 partition(dt='20220213',school='english');
外部分区表:
create external table t2(
id int,
name string
)partitioned by (dt varchar(10))
row format delimited
fields terminated by '\t'
location '/data/exp_tab';
*注意,删除外部分区表的分区时,是不会删除数据文件的,也就是说
ALTER TABLE T2 DROP PARTITION (DT='20220213'); 语句只会删除metastore中元数据信息,
在hdfs中查看/data/exp_tab会发现分区文件夹及数据仍然存在,这点其实是外部表的特性;
load data local inpath '/data/soft/hive/sample1.txt' into table
t2 partition(dt='20220120') ;
这个语句做了两个事:1加载数据从本地到hdfs的指定分区文件夹 2建立数据和表分区之间的映射关系(metastore)
即 等价于
hdfs dfs -mkdir /data/exp_tab/dt=20220120
hdfs dfs -put /data/soft/data2.txt /data/exp_tab/dt=20220120
alter table t2 add partition(dt='20220120') location '/data/exp_tab/dt=20220120';
这三个语句
/* +shuffle */
hive内置函数:
行转列
concat_ws(分隔符,字段) 通常与group by一起连用
collect_list 将元素集合到一个数组集合中
select name,concat_ws(',',collect_list(favors)) from t1 group by name;
列转行
split(字符串,切割符) 字符串拆开,返回数组
explore(数组) 转成多行
lateral view 虚拟表
select name,col1 from t1 lateral view explore(split(字符串,切割符)) t2 as col1;
虚拟视图 ---》 表名为t2 列别名