数据仓库Hive的简介与应用

Hive

简介

Hive是基于 Hadoop 的一个【数据仓库工具】,可以将结构化的数据文件映射为一张hive数据库表,并提供简单的 sql 查询功能,可以将 hql 语句转换为 MapReduce 任务进行运行。

数据处理的分类

  • 联机事务处理(OLTP)
    • 传统业务逻辑的处理
  • 联机分析处理(OLAP)
    • 数据仓库系统的主要应用

Hive的应用

Hive是一款数据仓库工具

数据仓库

​ 【数据仓库】英文名称为 Data Warehouse,可简写为 DW 或 DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制.

  • 数据仓库是用来做查询分析的数据库,基本不用来做插入,修改,删除操作。

  • 使用HQL语句转化为MapReduce任务,从而得到想要的数据

Hive架构原理

  • 用户接口

    • CLI命令行模式
    • JDBC连接
    • Web GUI
  • 元数据存储在metastore中,一般以mysql等数据库为载体

  • Hive的数据存储在HDFS中

  • 计算由MapReduce完成

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

  • Serializer
    • 序列化
  • DeSerializer
    • 反序列化

构建在数据存储和执行引擎之间,对两者实现解耦。

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;

动态分区

步骤:

  1. 定位数据源文件
  2. 建立非分区表并加载数据
  3. 建立外部分区表动态加载数据

参数

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
    • 需要实现 evaluate 函数
  • UDAF多进一出
    • 聚合函数,例如max,min,count等
    • 必须继承org.apache.hadoop.hive.ql.exec.UDAF
    • 内部类Evaluator实现org.apache.hadoop.hive.ql.exec.UDAFEvaluator接口
  • UDTF一进多出
    • 使用的很少
    • 例如lateral view,explore
  • 使用方法:在HIVE会话中add自定义函数的jar 文件,然后创建function 继而使用函数

分桶

分桶是把一列的信息以取哈希值的方式,将不同的数据放入不同文件存储

适用场景

  • 数据抽样

  • MapJoin

开启分桶

  • 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.quorumname>
    <value>node01,node02,node03value>
  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”);

你可能感兴趣的:(大数据)