数据仓库和hive语句中的分区表和分桶表

    数据仓库中从各数据源获取数据以及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra,转化Transfer,装载Load)的过程,ETL是数据仓库的流水线.

数据仓库(data warehouse)与数据库的区别:

  1. 数据仓库(data warehouse)-->面向分析, 不生产数据, 不消费数据, 只是数据的搬运工, 为了分析方便
  2. OLTP-->面向事务, 操作型处理, 就是关系型数据库(RDBMS),如: MySQL  oracle  sqlserver  db2
  3. OLAP-->面向分析, 分析型处理, 就是数据仓库, 面对的是历史数据(历史数据中的一部分就是来自数据库)展开分析.
数据仓库的分层架构:
  1. 源数据层(ODS): 直接引用外围的数据, 没有统一格式的, 不会直接应用使用,不利于分析
  2. 数据仓库层(DW): 来自于ODS, 要经过ETL的过程, 格式统一, 数据规整, 干净清洁
  3. 数据应用层(DA): 要去用DW层数据, 真正的数据使用者.

数据仓库中数据的流转流程: ODS-->DW-->DA

元数据: 描述数据的数据, 解析数据的数据, 或者说是解析性数据,相当于数据字典

数据仓库元数据: 记录数据仓库维护过程中的点点滴滴.

数据仓库:

  1. 提供数据存储能力
  2. 能够进行ETL的能力

Hive:

    hive是基于hadoop的一个数据仓库工具, 将结构化数据映射成一张表, 通过sql查询, 本质上是把sql转化成了mr程序执行.

所谓hive的分区(partitioned by)表就是以文件夹的形式把文件管理的更加清晰, 不同的分区内容代表着不同的文件夹, 当表是分区表的时候, 直接往表的目录下放数据的方式已经不行了, 德通过分区表特有的加载数据方式.

关于分区表的总结:

  1. 分区表是为了减少查询时候的全表扫描而出现.
  2. 分区表的现象就是在表的文件夹下多了一个文件夹, 而文件夹的名字就是分区    字段=分区值
  3. 分区字段的值在查询的时候会显示出来, 但是并不代表结构化数据中有这个字段, 分区字段事一个虚拟字段, 只是用来标识文件, 方便用户查询的时候根据这个字段进行过滤, 从而减少全局扫描.
  4. 分区表的数据通过load data的方式加载(在客户端执行), 加载的时候要指定分区的值(这个值就是这批数据文件夹名字的值).
  5. 关于分区字段一定不会是表中存在的字段

分区表在实际中的意义: 根据需求把数据管理在不同文件夹下.

分区表建表语句:

Create table t_user(id int,name string) partitioned by (country string) row format delimited fields terminated by ',';

Load data local inpath‘/root/hivedata/china.txt’ into table t_user2 partiton(country=’China’);

分桶表(分簇表):

Clustered by (字段) intonum_buckets buckets

翻译: 把数据按照指定的字段分成几桶(分成几个部分)

如:按照性别分成2个部分

Clustered by (sex) into 2 buckets

1.     分桶表把数据分开了, 分开几个部分就是几桶

2.     分桶表根据字段分, 这个字段一定是表中的字段

3.     在文件的层面上对数据进行分开

分桶表的操作;

1.     分桶表的功能默认不开启, 需要自己手动开启

Set hive.enforce.bucketing=true

2.     分成几桶也需要自己指定

Set mapreduce.job.reduces=N

 

总结分桶表:

1.     分桶表在文件层面, 把数据分开了,分开的语句是

Clustered by (字段) into num_bucketsbuckets, 其中的字段必须是表中已经存在的字段

2.     默认分桶规则: hash_function(字段)%桶的个数

当字段是int类型的时候hash_function(字段)=字段本身

如果是其他类型, 比较复杂, 字段值哈希 % 桶的个数

3.     分桶分成几个部分, 实际上就是reducetask执行的个数, 个数是几, 桶就是几, 最终文件就是几个部分,因此分桶的数据要想成功必须执行mr程序.

分桶表的出现, 提高了join查询时的效率, 减少了笛卡尔积的数量

使用规则: 把左右两边按照join字段分桶即可.

分桶表语法:

1.     指定开启分桶

Set.hive.enforce.buketing=true;

Set mapreduce.job.reduces=4;(分桶个数)

2.     创建一个用于分桶的表

drop table stu_buck;

create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdeptstring)

clustered by(Sno) sorted by(Sno DESC) into 4 buckets rowformat delimited fields terminated by ',';

3.     创建student表,并指定分隔符

create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)

row format delimited fields terminated by ',';

4.     把数据映射到student

load data local inpath '/root/hivedata/students.txt' intotable student;

5.     将数据导入分桶表,方式: insert + select    insert数据来自于select查询结果

insert overwrite table stu_buck select * from student clusterby(Sno);





    

你可能感兴趣的:(数据仓库和hive语句中的分区表和分桶表)