前言
ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract),转换(transform),加载(load)至目的端的过程
- 数据抽取:把不同的数据源数据抓取过来,存到某个地方
- 数据清洗:过滤那些不符合要求的数据或者修正数据之后再进行抽取
- 不完整的数据:比如数据里一些应该有的信息缺失,需要补全后再写入数据仓库
- 错误的数据:比如字符串数据后面有一个回车操作、日期格式不正确、日期越界等,需要修正之后再抽取
- 重复的数据:重复数据记录的所有字段,需要去重
- 数据转换:不一致的数据转换,转换换成统一口役,业务需求的表示方式
MR + HDFS的数据处理方式,编码复杂,对技术要求比较高。基于SQL的方式则要灵活许多。
Hive架构
- Hive 是一个基于 Hadoop 文件系统之上的数据仓库架构,存储用hdfs,计算用mapreduce
- Hive 可以理解为一个工具,不存在主从架构,不需要安装在每台服务器上,只需要安装几台就行了
- hive还支持类sql语言,它可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能
- hive有个默认数据库:derby,默认存储元数据—》后期转换成关系型数据库存储mysql
简单的比喻就是一个web应用
- DDL操作转化为原数据存储在mysql中
- DML操作直接转化成MR,向yarn平台提交任务
三种表的创建方式
创建一张能识别以“ ”分割列的表
create table stu_info(
num int,
name string
)
row format delimited fields terminated by " ";
加载数据到本地致表中
load data local inpath ‘/opt/datas/test.txt’ into table stu_info;
注意:‘/opt/datas/test.txt’ 本地数据目录位置
子查询方式: as select, 将查询的数据和表的结构赋予一张新的表
create table stu_as as select name from stu_info;
like方式, 复制表的结构赋予一张新的表
create table stu_like like stu_info;
分区表
hive也提供分区表的概念
create external table if not exists tablename(
a string,
b string)
partitioned by (year string,month string)
row format delimited fields terminated by ',';
hive通常有三种方式对包含分区字段的表进行数据插入:
- 静态插入数据:要求插入数据时指定与建表时相同的分区字段,如:
insert overwrite table tablename (year='2017', month='03') select a, b from tablename2;
- 动静混合分区插入:要求指定部分分区字段的值,如:
insert overwrite table tablename (year='2017', month) select a, b from tablename2;
- 动态分区插入:只指定分区字段,不用指定值,如:
insert overwrite table tablename (year, month) select a, b from tablename2;
insert into 与 insert overwrite 都可以向hive表中插入数据,但是insert into直接追加到表中数据的尾部,而insert overwrite会重写数据,既先进行删除,再写入。如果存在分区的情况,insert overwrite会只重写当前分区数据。
分区表的文件组织
一个表中的数据很多1T的数据 user (id,name,address,age,sex)
在这个表中 查询age=18的人
sql:
select * from user where age=18;
如果所有数据全部存储在一个普通表中,执行上面的语句的时候,全表扫描 才能得到我们最终想要的结果 最终执行效率很低
如何提升查询性能: 缩小查询范围
从数据存储开始入手
按照年龄将我们的数据分成不同的‘小 表’存储
/user
/age=18
/age=17
/age=16
/age=34
.......
不同表中存储的就是 不同年龄的数据
这个时候 在进行执行
select * from user where age=18;
只会扫描
/user
/age=18 减少了扫描范围 提升了查询性能
上面的案例中 每一个年龄对应的一个“小表”称为一个分区
user表被分成了很多的分区 user表称为分区表
分区表: 减少了扫描范围 提升了查询性能
一般怎么样进行分区:
进行分区的时候 依据字段--- 分区字段
分区字段:一般是过滤的条件字段 经常用于过滤的字段
select * from user where address="河南" and sex="男";
分区字段: address+ sex
/address /sex
select * from user where age=20; 全表扫描
**分区表的存储:**
普通表数据的存储:
hdfs: /user/hive/warehouse/数据库/表/数据文件
分区表:不同目录
hdfs: /user/hive/warehouse/数据库/表/age=18/
/user/hive/warehouse/数据库/表/age=19/
/user/hive/warehouse/数据库/表/age=20/
主要参考
《Hive编程指南》
《大数据数据仓库——hive学习权威指南》
《hive的数据组织形式》