Hive离线数据仓库

本文详细介绍了Hive作为离线数据仓库的使用,涵盖Hive的内部表、外部表、分区表和分桶表概念及操作,强调了表设计和查询优化的重要性,包括自定义函数、JDBC操作、优化策略如MapJoin和解决数据倾斜问题,以及Hive的运行模式和自动化运维设置。
摘要由CSDN通过智能技术生成

在这里插入图片描述

Hive概述

Hive基于Hadoop的数据仓库工具,提供了一系列的工具,可以用来进行数据提取、转化、加载,是一种可以存储、查询和分析存储在Hadoop中的大规模数据机制。它可以将结构化的数据文件映射成一张表,并提供完成的sql查询功能,可以将sql语句转换成MapReduce任务进行运行。

Hive本质上是基于Hadoop的一种分布式计算框架,底层仍然是MR,本质上是离线大数据分析工具

数据仓库 VS 数据库

数据库 数据仓库
系统类型 Online Transaction Processing
OLTP 联机事务处理系统
Online Analytical Processing
OLAP 联机分析处理系统
服务对象 为线上系统提供实时查询 为离线分析存储历史数据
功能分类 具有完整的增删改查能力 只支持一次写入多次查询,不支持航级别的增删改
事务特征 具有完整的事务能力 不强调事务的特性
设计原则 避免冗余 提高存储和处理的效率 人为冗余 提高查询的效率

Hive特点

  • 建立表格时,不是建立一张传统意义的数据表,而是将数据文件映射成一张数据库表,并提供完整的sql查询功能
  • 受限于Hadoop的HDFS设计,1.0不支持行级别增删改,2.0可以支持追加操作
  • 离线数据分析工具
  • 不支持事务的特性,追求性能
  • 通常会通过制造冗余来提高数据查询性能

安装配置要点

需配置JAVA_HOME和HADOOP_HOME,并配置MySQL来替换内部的Derby数据库存储元数据。

内置Derby问题:

  • 数据易消失:Derby为文件型数据库,进入时会检查当前目录是否会有metastore.db的文件夹(存储数据库),没有就新建,会造成换目录登录,元数据就找不到。
  • 仅支持单用户操作:Derby是单用户型的数据库,无法支持多用户操作。

配置MySQL要点:

  • 修改conf/hive-site.xml 文件
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
  <description>username to use against metastore database</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>root</value>
  <description>password to use against metastore database</description>
</property>
  • 将mysql驱动【mysql-connector-java-******-bin】复制到hive的lib目录下
  • mysql元数据库中的hive库,必须是latin1的编码集

Hive的重要的元数据表

DBS :存储了hive中库元数据的信息,包括库编号、库名称 库所有者 库对应在hdfs中的存储位置

TBLS:存储了hive中表相关的信息,包括表的编号、所属库的编号、表所有者、表名称、表类型

COLUMNS_V2:存储了hive中表对应列的信息,包括所属表的编号、列名称、列类型、列的位置

SDS:存储了hive中表对应在HDFS中的存储位置信息,包括表的编号、存储位置


Hive的各种表

1 内部表 VS 外部表

对比项 内部表 外部表
定义 先有表再有数据 先有数据再有表
特点 执行表格删除时,会删除原表 执行表格删除时,不会删除原表
创建语句 create table student
(id int, name string)
row format delimited fields
terminated by ‘\t’;
create external table teacher
(id int ,name string)
row format delimited fields
terminated ‘\t’location ‘/teacher’;
导入表格 load data local inpath
‘/home/software/1.txt’
into table stu;
本来就是导入的

2 分区表

​ 表的文件夹下再创建分区对应的文件夹,将表中的数据按照分区字段分放在不同的分区文件夹下,这样之后按照分区字段查询数据时,可以直接找到分区文件夹得到数据,而不用在全部数据中进行过滤,从而提升了查询的效率。

2.1 操作语法

创建表:

create table book (id bigint, name string) partitioned by (country string,…) row format delimited fields terminated by ‘\t’;

加载数据:

load data local inpath ‘./book_china.txt’ into table book partition (country=‘china’,…);

修改结构分区:

alter TABLE book add PARTITION (country=‘jp’,category = ‘xs’) location ‘/user/hive/warehouse/…’;

查询表:

select * from book where category=‘cn’;

显示分区:

show partitions iteblog;

删除分区:

alter table book drop partition(category=‘cn’)

修改分区:

alter table book partition(category=‘french’) rename to partition (category=‘hh’);

3 分桶表

Hive中也支持分桶表,分桶表是一种更细粒度的数据分配方式,主要作用是实现数据的抽样,方便进行数据测试。分桶表通过hash分桶算法,将数据分放在不同的桶(hdfs中的文件)中,方便后续获取。

3.1 分桶语法

开启分桶功能:hive>set hive.enforce.bucketing=true;

创建带桶的表:create table teacher(name string) clustered by (name)into 3 buckets row format delimited fields terminated by ‘’;

Hive的分桶过程是在底层的MR中实现的,所以必须在一个MR过程中分通才可以实现,通常我们不会直接在原始的表中实现分通,而是单独创建一个带有分通的测试表,从原始表中向分桶的测试表中导入数据,在导入的过程中,触发MR操作,实现分桶。

往表里插入数据insert overwrite|into table teacher selec

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值