数据管理&数据仓库&Hive的使用


讲解的是数据管理,以及数仓的定义、以及Hive的使用。Hive偏向于操作。

数据管理&数据仓库

数据文件管理真谛

  1. 文件管理的真谛在于方便保存和迅速提取,所有的数据文件将通过某种属性分类被很好地组织起来,放在最能方便找到的地方。
    解决这个问题目前最理想的方法就是分类管理
  2. 会部署一个文件服务器,来统一管理文件。这样可以对企业管理带来如下好处:
    定时集中对文件进行备份;
    可以统一制定文件安全访问权限策略;
    可以统一进行文件服务器防病毒管理。
  3. ftp 文件服务
    Samba 文件服务
    NFS 文件服务
  4. FTP是一个文件传输的协议,采用 Client/Server 架构。用户可以通过各种不同的 FTP客户端程序,借助FTP协议,来连接FTP服务器,以上传或者下载文件。它使用两个连接与客户端通信。

文件管理规范

  1. FTP 服务进行跨部门文件共享的相关规范。以数据库数据文件导出至ftp文件服务器共享为例,目录下会存在以下3种格式文件。
    1.1 接口新增数据文件
    正常数据:文件类型标示_源系统数据库类型简写.源系统数据库.表名称_数据日 期_重传序号.lzo
    如正常数据为:
    增量(上次导出之后的新数据):
    i_s.Peking.orders_20130711_000.lzo 全量(表中所有的数据): a_s.Peking.orders_20130711_000.lzo
    1.2 接口控制校验文件
    正常数据:增全量标示_源系统数据库类型简写.源系统数据库.表名称_数据日期 _重传序号.md5
    如正常数据为:
    增量:
    i_s.peking.orders_20130711_000.md5 全量: a_s.peking.orders_20130711_000.md5
    控制校验文件的存在意义在于标识数据的完整性校验,预防上传丢失导致其他使用者获取不完整数据。
    1.3 2.3. 接口表结构文件
    正常数据:增全量标示_源系统数据库类型简写.源系统数据库.表名称_数据日期 _重传序号.xml
    如正常数据为:
    增量:
    i_s.peking.orders_20130711_000.xml 全量: a_s.peking.orders_20130711_000.xml
    表结构文件存在意义在于: 便于数据的使用人员快速的了解本批次数据的大
    致内容,也方便后续回头对数据进行检测时作为依照。

数据质量检测

  1. 数据的完整性、数据的一致性(统一的格式,数据是否符合逻辑)、准确性、及时性。

数据仓库–为什么出现数据仓库–为了分析

  1. 概念:数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的 目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持目的而创建。
  2. 数据库是支持业务,是面向业务的。而数仓是面向分析的,不生产数据,不消耗数据。
  3. 四大主要特征:数据仓库是面向主题的(Subject-Oriented )、集成的(Integrated)、非 易失的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理 决策 。

数据仓库和数据库的区别

  1. 数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别。
    操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing,), 也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通 常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、 完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段, 主要用于操作型处理。
    分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing)一 般针对某些主题的历史数据进行分析,支持管理决策。
  2. 首先要明白,数据仓库的出现,并不是要取代数据库。
    数据库是面向事务的设计,数据仓库是面向主题设计的。
    数据库一般存储业务数据,数据仓库存储的一般是历史数据。
    数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的 User 表,记录用户名、密码等简单数据即可,符合业务应用, 但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
    数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

数据仓库的分层架构

在这里插入图片描述
1、源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
2、数据仓库层(DW):也称为细节层,经过ETL(抽取 Extra, 转化 Transfer, 装载 Load)的过程,DW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
3、数据应用层(DA 或 APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
为什么要对数据仓库分层?
用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了 多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作。

数据仓库的元数据管理

  1. 元数据:记录数据仓库在维护过程中的点点滴滴,数据仓库的主题,数据从哪里来的,用什么工具ETL,数据当中有什么。数据当中的字段。
  2. 管理数据仓库的元数据目的:使数据仓库的设计、部署、操作和管理达成协同和一致。

Apache Hive

  1. Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为 一张数据库表,并提供类 SQL 查询功能。
  2. 本质是将 SQL 转换为 MapReduce 程序。 主要用途:用来做离线数据分析,比直接用 MapReduce 开发效率更高。
  3. 直接使用 Hadoop MapReduce 处理数据所面临的问题: 人员学习成本太高
    MapReduce 实现复杂查询逻辑开发难度太大
    使用 Hive :
    操作接口采用类 SQL 语法,提供快速开发的能力 避免了去写 MapReduce,减少开发人员的学习成本 功能扩展很方便
    吗,,
  4. Hive 与 Hadoop 的关系
    Hive 利用 HDFS 存储数据,利用 MapReduce 查询分析数据。

启动

命令分别
1:在export/script中,sh zk.sh(保证zk启动)
2:还在这个目录,sh journalnode.sh (journalnode启动,咱的是高可用哈,一般线上都是高可用)
3:不管在哪个目录,start-all.sh(启动hadoop,以设置全局)

4:不管在哪,直接输入hive,回车即可(启动hive,以设计全局

直观感受hive & 重点体会映射

  1. hive几种使用方式:

    1.Hive交互shell      bin/hive
    2.Hive JDBC服务(参考java jdbc连接mysql)
    3.hive启动为一个服务器,来对外提供服务
    	bin/hiveserver2
    	nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err &
    	
    	启动成功后,可以在别的节点上用beeline去连接
    	bin/beeline -u jdbc:hive2://mini1:10000 -n root
    	
    	或者
    	bin/beeline
    	! connect jdbc:hive2://mini1:10000
    
    4.Hive命令 
    	hive  -e  ‘sql’
    	bin/hive -e 'select * from t_test' 
    	```
    
  2. create table t_t2(id int,name string,age int) row format delimited fields terminated by ',';

  3. 映射:
    1、结构化文件不能乱放
    /user/hive/warehouse/库名/表名
    2、hive database <–>/user/hive/warehouse/下的文件夹
    hive下面的表 <–> /user/hive/warehouse/库名.db /下的文件夹
    3、文件中结构化数据的类型要和定义的table类型一致。个数需要对应上,顺序对应上。
    4、结构化数据的分隔符需要指定。
    create table t_t2(id int,name string,age int) row format delimited fields terminated by ',';
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

Apache Hive–DDL–建表语句–hive支持的数据类型

  1. 难点在于hive的sql语句学习
  2. DDL操作:数据定义语言,表 库 字段 结构问题
  3. DML:数据操作语言 表数据CRUD,只不过数据仓库没有修改操作
  4. create table table_name;
  5. CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
    [(col_name data_type [COMMENT col_comment], …)]
    [COMMENT table_comment]
    [PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
    [CLUSTERED BY (col_name, col_name, …)
    [SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
    [STORED AS file_format]
    [LOCATION hdfs_path]
  6. hive不仅支持sql数据类型,还支持java数据类型,支持复杂类型(array, struct, map), 大小写不敏感。

Apache Hive–DDL–建表语句–hive分隔符的指定

  1. ROW FORMAT DELIMITED
    [FIELDS TERMINATED BY char]
    [COLLECTION ITEMS TERMINATED BY char]
    [MAP KEYS TERMINATED BY char]
    [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES
    (property_name=property_value, property_name=property_value,…)]
  2. row format: 指定分隔符
    delimited: 使用hive内置默认的分隔符类
    serde: 使用其他分隔符的类
  3. row format delimited | serde
  4. 例子:
    zhangsan beijing,shanghai,tianjin,hangzhou
    wangwu shanghai,chengdu,wuhan,haerbin
     create table complex_array(name string,work_locations array<string>)
     ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
     COLLECTION ITEMS TERMINATED BY ',';
    
    1,zhangsan,唱歌:非常喜欢-跳舞:喜欢-游泳:一般般
    2,lisi,打游戏:非常喜欢-篮球:不喜欢
    create table t_map(id int,name string,hobby map<string,string>)
    row format delimited 
    fields terminated by ','
    collection items terminated by '-'
    map keys terminated by ':' ;
    

Apache Hive–DDL–建表语句–hive默认分隔符

  1. hive 建表的时候默认的分割符是’\001’,若在建表的时候没有指明分隔符, load 文件的时候文件的分隔符需要是’\001’;若文件分隔符不是’001’,程序不会 报错,但表查询的结果会全部为’null’;
    用 vi 编辑器 Ctrl+v 然后 Ctrl+a 即可输入’\001’ -----------> ^A
    在这里插入图片描述在这里插入图片描述

Apache Hive–DDL–建表语句–hive分区表

  1. 在这里插入图片描述
    两个表的内容同时显示在table t_4
  2. 如果表t_user有三个字段: id name country
    select * from t_user where country=‘china’;
    需要遍历所有表中的字段,才能显示出最终符合条件的结果。效率低
    为了避免select查询全表的问题,hive提出 分区表(partitioned by) 概念。给文件归类,打上标识。
    真实字段 2个 + 标识
  3. hive的分区就是以文件夹的形式把文件管理的更加清晰,不同的分区代表着不同的文件夹。
  4. 没有分区的建表语句
    create table t_user(id int,name string) row format delimited fields terminated by ',';
    下面是有分区建表语句
    create table t_user2(id int,name string) partitioned by (country string) row format delimited fields terminated by ',';
  5. 当表是分区表的时候 直接往表的目录下放数据已经不行了 得通过分区表特有的加载数据方式
    load data local inpath '/root/hivedata/china.txt' into table t_user2 partition(country='China');
    不仅加载了数据 还指定本次数据是属于哪个分区的(是那个文件夹下)
    在这里插入图片描述
  6. 分区总结:
    1、为了减少查询时的全表扫描。
    2、分区表是在表的文件夹下多一个文件夹,文件夹的名字就是分区 字段=分区名
    3、分区字段的值在查询的时候 会显示出来 但是并不代表结构化数据中有这个字段 分区字段是一个虚拟字段 只是用来标识文件
    方便用户查询的时候 根据这个标识进行过滤 从而减少了全局扫描
    4、分区表的数据通过load data的方式加载 加载的时候要指定分区的值(这个分区的值就是这批数据文件夹名字的值)
    5、关于分区字段一定不会是表中存在的字段 如果是直接编译报错 体会什么叫给数据打标识

Apache Hive–DDL–建表语句–hive多分区表

  1. 双分区表
    create table day_hour_table (id int, name string) partitioned by (year string, month string) row format delimited fields terminated by ‘,’;
    加载双分区数据
    load data local inpath ‘/root/hivedata/china.txt’ into table day_hour_table partition(year=‘2017’,month=‘06’);

Apache Hive–DDL–建表语句–hive分桶表

在这里插入图片描述

  1. 下面是分桶表的操作:
    1、分桶的功能默认不开启 需要自己手动开启
    set hive.enforce.bucketing = true;
    2、分成几桶 也需要自己指定
    set mapreduce.job.reduces=N;
    3、建表语句
    create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)
    clustered by(Sno)
    into 4 buckets
    row format delimited
    fields terminated by ‘,’;

  2. 下面分桶表的导入:目标(数据映射成功 数据分成4个桶)
    猜想:
    方式一: hadoop fs -put? 只满足映射成功 不满足分桶需求 这个方法 pass
    方式二: 莫非跟分区一样?load data?
    load data local inpath '/root/hivedata/student.txt' into table stu_buck cluster(Sno);
    missing EOF at ‘cluster’ near ‘stu_buck’ (state=42000,code=40000)
    不认识这个sql中的字段 cluster 直接编译就出错 这个方法 pass
    真正分桶表的数据导入方式:insert+select insert数据来自于后select查询的结果
    insert overwrite table stu_buck
    select * from student cluster by(Sno);

  3. 举例子
    建student

    create table students(Sno int,Sname string,Sex string,Sage int,Sdept string)
    row format delimited
    fields terminated by ',';
    

    把数据映射到student
    load data local inpath '/root/hivedata/students.txt' into table students;
    打开分桶表:
    set hive.enforce.bucketing = true;
    set mapreduce.job.reduces=4;
    insert+select insert数据来自于后select查询的结果
    insert overwrite table stu_buck
    select * from student cluster by(Sno);

  4. 分桶表总结:
    1、分桶表在文件层面 把数据分开了 至于按照什么分开 分开成几个部分
    clustered by(字段) into N buckets
    其中的字段的必须是表中已经存在的字段
    2、默认是按照如何规则分开的呢

    默认分桶规则: hash_func(字段) % 桶的个数
    当字段是int类型的时候 hash_func(字段)=字段本身
    如果是其他类型 比较复杂 字段值哈希 % 桶的个数
    但是能保证尽量把数据平均分在几个桶当中

3、分桶分成几个部分 实际上就是reducetask执行的个数
个数是几 桶就是几 最终文件就是几个部分
因为分桶的数据要想成功必须执行mr程序 有mr程序才会有reducaTask

Apache Hive–DDL–建表语句–hive分桶表的意义

在这里插入图片描述

  1. 分桶表的出现 提高join查询时的效率 减少了笛卡尔积的数量
    使用规则:把左右两边按照join的字段分桶即可
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王二小、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值