Hive
简介
Hive是基于 Hadoop 的一个【数据仓库工具】,可以将结构化的数据文件映射为一张hive数据库表,并提供简单的 sql 查询功能,可以将 hql 语句转换为 MapReduce 任务进行运行。
数据处理的分类
- 联机事务处理(OLTP)
- 联机分析处理(OLAP)
Hive的应用
Hive是一款数据仓库工具
数据仓库
【数据仓库】英文名称为 Data Warehouse,可简写为 DW 或 DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制.
Hive架构原理
HQL
Hive的查询语言,与SQL(结构化查询语言)类似
DDL数据定义语句
数据库增删改查语句
表的增删改查语句
DML数据操作语句
四种导入/插入语句
-
LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]
-
INSERT OVERWRITE TABLE person2 [PARTITION(dt=‘2008-06-08’, country)] SELECT id,name, age From ppt;
-
FROM person t1 INSERT OVERWRITE TABLE person1 [PARTITION(dt=‘2008-06-08’, country)] SELECT t1.id, t1.name, t1.age ;
-
同SQL的INSERT语句,不常用
查询数据并保存
- 保存数据到本地
- insert overwrite local directory ‘/opt/datas/hive_exp_emp2’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
select * from db_1128.emp ;
- 保存数据到HDFS上
- insert overwrite directory ‘/user/hive/hive_exp’
select * from sufei;
- 在shell中将数据重定向到文件中
- hive -e “select * from abc” > /root/abc
备份数据
EXPORT TABLE db_1128.emp TO ‘/user/hadoop/hive/datas/export/emp’ ;
还原数据
IMPORT FROM ‘/user/hadoop/hive/datas/export/emp’ ;
Hive SerDe
构建在数据存储和执行引擎之间,对两者实现解耦。
Hive通过ROW FORMAT DELIMITED以及SERDE进行内容的读写。
Hive分区(partition)
Hive创建表时,可以依据表的其中一个或多个字段将表分为不同的分区。不同的分区存储在HDFS不同的目录中,可以通过分区字段对表进行检索。
必须在表定义时创建partition !
在创建 删除多分区等操作时一定要注意分区的先后顺序,他们是父子节点的关系。分区字段不要和表字段相同
- 单分区建表语句
- create table day_table(id int, content string) partitioned by (dt string) row format delimited fields terminated by ‘,’;
- 双分区建表语句
- create table day_hour_table (id int, content string) partitioned by (dt string, hour string) row format delimited fields terminated by ‘,’;
- 添加分区
- ALTER TABLE day_table ADD PARTITION (dt=‘2008-08-08’, hour=‘08’)
- 删除分区
- ALTER TABLE table_name DROP partition_spec, partition_spec,…
- 数据加载进分区表中
- LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 …)]
- 查看分区
- show partitions day_hour_table;
- 重命名分区
- ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
动态分区
步骤:
- 定位数据源文件
- 建立非分区表并加载数据
- 建立外部分区表并动态加载数据
参数
hive.exec.dynamic.partition = true
hive.exec.dynamic.partition.mode = nostrict
hive.exec.max.dynamic.partitions.pernode由实际需求决定
hive.exec.max.dynamic.partitions 同样由实际需求决定
函数自定义
- UDF单进单出
- 例如ceil,floor等
- 自定义 UDF 需要继承 org.apache.hadoop.hive.ql.UDF
- 需要实现 eva luate 函数
- UDAF多进一出
- 聚合函数,例如max,min,count等
- 必须继承org.apache.hadoop.hive.ql.exec.UDAF
- 内部类eva luator实现org.apache.hadoop.hive.ql.exec.UDAFeva luator接口
- UDTF一进多出
- 使用的很少
- 例如lateral view,explore
- 使用方法:在HIVE会话中add自定义函数的jar 文件,然后创建function 继而使用函数
分桶
分桶是把一列的信息以取哈希值的方式,将不同的数据放入不同文件存储
适用场景
开启分桶
- set hive.enforce.bucketing=true;
实例
- 创建普通表
- CREATE TABLE mm( id INT, name STRING, age INT)
- ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
- 创建分桶表
- CREATE TABLE psnbucket( id INT, name STRING, age INT)
- CLUSTERED BY (age) INTO 4 BUCKETS
- ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
- 加载数据
- insert into table psnbucket select id, name, age from mm;
- 抽样
- select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);
Lateral View
Lateral View用于和UDTF函数(explode、split)结合来使用
主要解决在select使用UDTF做查询过程中,查询只能包含单个UDTF,不能包含其他字段、以及多个UDTF的问题
LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)
Hive的优化
- 尽量少的转化为MapReduce任务执行,如查询本表字段,WHERE用本表字段作为过滤条件;
- 可以设为本地模式,小于指定大小(默认128M)的文件在本地运行,大大增加运行速度;
- 严格模式:防止误操作,查询分区表时,可以避免不加分区条件的查询,order by语句必须加limit限制,限制笛卡尔积的查询;
- Hive排序尽量慎用全排序ORDER BY,使用SORT BY(对单个reduce数据进行排序),DISTRIBUTE BY(分区排序),CLUSTER BY(相当于SORT BY+ DISTRIBUTE BY)可以降低排序计算量;
- 多表查询使用MapJoin,小表放在左边,通过添加MapJoin标记或者设置自动MapJoin实现;
- 聚合函数(如count)可设置在Map端进行聚合;
- 控制Map和Reduce的数量;
- 使用JVM重用,设置task插槽。
Hive与Hbase整合
1、把hive-hbase-handler-1.2.1.jar cp到hbase/lib 下
同时把hbase中的所有的jar,cp到hive/lib
2、在hive的配置文件增加属性:
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
3、在hive中创建临时表
CREATE EXTERNAL TABLE tmp_order
(key string, id string, user_id string)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,order:order_id,order:user_id”)
TBLPROPERTIES (“hbase.table.name” = “t_order”);
CREATE TABLE hbasetbl(key int, name string, age string)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,cf1:name,cf1:age”)
TBLPROPERTIES (“hbase.table.name” = “xyz”, “hbase.mapred.output.outputtable” = “xyz”);