数据仓库中从各数据源获取数据以及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra,转化Transfer,装载Load)的过程,ETL是数据仓库的流水线.
数据仓库(data warehouse)与数据库的区别:
数据仓库中数据的流转流程: ODS-->DW-->DA
元数据: 描述数据的数据, 解析数据的数据, 或者说是解析性数据,相当于数据字典
数据仓库元数据: 记录数据仓库维护过程中的点点滴滴.
数据仓库:
Hive:
hive是基于hadoop的一个数据仓库工具, 将结构化数据映射成一张表, 通过sql查询, 本质上是把sql转化成了mr程序执行.
所谓hive的分区(partitioned by)表就是以文件夹的形式把文件管理的更加清晰, 不同的分区内容代表着不同的文件夹, 当表是分区表的时候, 直接往表的目录下放数据的方式已经不行了, 德通过分区表特有的加载数据方式.
关于分区表的总结:
分区表在实际中的意义: 根据需求把数据管理在不同文件夹下.
分区表建表语句:
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);