大白话详解大数据hive知识点,老刘真的很用心(1)

前言:老刘不敢说写的有多好,但敢保证尽可能用大白话把本身复习的知识点详细解释出来,拒绝资料上的生搬硬套,作到有本身的了解!mysql

 

01 hive知识点(1)linux

 

第1点:数据仓库的概念sql

因为hive它是基于hadoop的一个数据仓库工具,老刘先讲讲数据仓库的一些东西,再开始讲hive。shell

数据仓库,听名字就知道它是用来存放数据的一个仓库,仓库不一样于工程,仓库只用来存放东西,不生产,也不消耗。数据库

精简的讲,数据仓库它自己不生产数据,也不会消耗数据,数据从外部来,供给外部使用,主要用于数据分析,对企业的支持决策作一些辅助。安全

 

第2点:数据仓库的特征架构

数据仓库有4个特征:并发

面向主题的:就是说它都是有目的的进行构建数据仓库,用它干某件事;工具

集成的:就是说将全部用到的数据都集成到一块儿;oop

非易失的:就是说里面的数据通常都不会改变;

时变的:就是说随着时间的发展,数据仓库的分析手段也会发生改变。

 

第3点:数据仓库和数据库的区别

看到以前讲的数据仓库概念就知道,这两个区别大了。

首先举个例子,客户在银行作的每笔交易都会写入数据库,被记录下来,就至关于用数据库记帐。

而数据仓库是分析系统的数据平台,它从事务系统获取数据,并作汇总、加工,为决策者提供决策的一些依据。

好比,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。若是存款又少,消费交易又多,那么该地区就有必要设立ATM了。 

接着要说的是,数据库和数据仓库的区别实际上讲的是OLTP和OLAP的区别。

操做性处理,OLTP联机事务处理,也能够叫作面向交易的处理系统,它是针对于具体业务在数据库联机的平常操做,一般对记录进行查询、修改,人们通常关心操做的响应时间、数据是否安全、完整和并发的相关问题。

分析型处理,联机分析处理OLAP,通常针对于某些主题的历史数据进行分析,支持管理决策。

总结一下就是,数据仓库的出现,不是为了取代数据库。

数据库是面向事务的设计,数据仓库是面向主题的设计。

数据库存储的通常是业务数据,数据仓库存储的通常是历史数据。

数据库是为了捕获数据设计的,而数据仓库是为了分析数据设计的。

还有一点就是,数据仓库是在数据库已经大量存在的状况下,为了进一步挖掘数据资源,为了进行决策而产生的。

 

第4点:数据仓库分层

首先说说数据仓库可分为三层:

源数据层(ODS):它主要用于保管咱们的原始数据;

数据仓库层(DW):它主要对源数据层过来的数据进行清洗,而后用于数据分析,大部分工做都是在这一层写sql;

数据应用层(APP):它主要用于数据的各类展现。

那为何要进行数据仓库分层呢?

首先想一想,一个很是复杂的问题,咱们通常怎么解决,是否是一般把一个复杂的问题,分解成不少小问题,每一个小问题相对于这个大问题,是否是相对容易点。

总结一下就说,对数据仓库进行分层,至关于把一个复杂的工做拆成多个简单的工做,每一层的处理逻辑相对简单和容易理解,这样咱们比较容易保证每个步骤的正确性,就算数据出现错误,咱们也能够相对容易找到哪里出错,快速纠正错误。

进行数据仓库分层,达到了用空间换时间的效果,经过大量的预处理提高系统的效率。 

 

第5点:hive是什么

 

 

简单一句话,因为mapreduce代码很是复杂,hive就是一个把SQL语句转换为mapreduce任务的工具,经过hive大大简化了mr的开发。

也能够这样说,hive的主要的工做就是将咱们写的sql语句翻译成为mr的任务,运行在yarn上面,hive能够简单的理解为mr的客户端

 

第6点:hive和数据库的区别

区别太多了只说一点,Hive 不支持记录级别的增删改操做。

早期的版本,hive不支持,增删改,只支持查询操做,如今的版本,都支持。

可是实际工做当中不会用到增删改,只会用到查询操做select。

剩下的,你们本身去搜搜。

hive它只具备SQL数据库的外表,但应用场景彻底不一样。因为执行器MapReduce执行速度特别慢,hive只能作离线数据的处理。

 

第7点:hive的架构

 

用户接口:提供用户经过各类方式来访问hive,能够经过jdbc,能够经过hiveserver2,还能够经过hive shell;

解析器:主要就是用于解析sql语法;

编译器:将解析以后的sql语法进行编译成为MR的任务;

优化器:有必定的优化功能,自动的会对咱们写的sql语句进行调优,调优的功能有限的;

执行器:提交mr的任务到yarn上面去执行的;

底层的hadoop:数据存储hdfs,数据的计算mr,运行在yarn上面的。

 

第8点:hive的数据类型

 

 

第9点:hive的DDL操做

可能会有人认为hive的DDL操做,之后直接百度或者翻资料就行,压根不用记,可是在老刘看来,至少要记住几个经常使用的命令,万一哪天别人问,本身想不起来,还要去百度搜一下,多尴尬啊!

首先说说hive的数据库操做:

1、建立数据库
create database if not exists db_hive;
2、显示全部数据库
show databases;
3、查询数据库
show databases like 'gmall';
4、查看数据库详情
desc database gmall;
5、显示数据库详细信息
desc database extended gmall;
6、切换当前数据库
use gmall;
7、删除数据库
若是删除的数据库不存在,最好采用if exists 判断数据库是否存在
drop database if exists gmall;
若是数据库中有表存在,这里须要使用cascade强制删除数据库
drop database if exists gmall cascade;

接下里说说hive的DDL操做:

它有一个建表的语法,若是直接看这个语法,老刘不建议直接看,经过例子慢慢了解,查漏补缺最好。

hive建表分为内部表和外部表,首先讲建立内部表。

1、直接建表
先切换到本身要用的数据库
use myhive;
create table stu(id int,name string);

2、经过AS 查询语句完成建表:将子查询的结果存在新表里,有数据
create table if not exists myhive.stu1 as select id, name from stu;

3、根据已经存在的表结构建立表
create table if not exists myhive.stu2 like stu;

4、查询表的类型
desc formatted myhive.stu;

根据查询表的类型,能够获得这张图,这张图包含了不少信息,后续会慢慢讲述到,你们放心!

通常最经常使用的就是建立内部表并指定字段之间的分隔符,指定文件的存储格式,以及数据存放的位置,注意这个数据存放的位置指的是在HDFS上的存储位置,千万不要记错了,老刘最开始就记错了!

建立的代码以下:

create table if not exists myhive.stu3(id int ,name string)
row format delimited fields terminated by '\t' stored as textfile location '/user/stu2';

如今开始建立外部表,首先要知道什么是外部表,和内部表有什么区别?

外部表由于是指定其余的hdfs路径的数据加载到表当中来,因此hive表会认为本身不彻底独占这份数据,因此删除hive表的时候,数据仍然存放在hdfs当中,不会删掉。

建立外部表的时候须要加上external关键字,location字段能够指定,也能够不指定,指定就是数据存放的具体目录,不指定就是使用默认目录 /user/hive/warehouse。

建立代码以下:

create external table myhive.teacher (t_id string,t_name string) row format delimited fields terminated by '\t';

总结一下内部表与外部表的区别:

一、外部表在建立的时候须要加上external关键字。

二、内部表删除后,表的元数据和真实数据都被删除了;可是外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期仍是能够恢复出来。

那咱们通常何时使用内部与外部表呢?

因为内部表删除表的时候会同步删除HDFS的数据文件,因此若是咱们肯定一个表仅仅是咱们本身独占使用,其余人不适用的时候就能够建立内部表,若是一个表的文件数据,其余人也要使用,那么就建立外部表。

通常外部表都是用在数据仓库的ODS层,内部表都是用在数据仓库的DW层。

那表建立好以后,如何把数据导进去呢?通常使用load的方式来加载数据到内部表或者外部表,不用insert。

load数据能够从本地文件系统加载或者也能够从hdfs上面的数据进行加载,注意本地系统指的是linux系统。

① 从本地系统加载数据到表里面

首先建立在本地系统建立一个文件,把数据表上传到这个文件里,而后在把这个文件上传到表里。

mkdir -p /kkb/install/hivedatas
load data local inpath '/kkb/install/hivedatas/teacher.csv' into table myhive.teacher;

注意,本地系统导入要加上一个local;

② 从hdfs上面导入数据

首先在hdfs上建立一个目录,把数据文件上传上去,而后在把这个文件上传到表里。

hdfs dfs -mkdir -p /kkb/hdfsload/hivedatas
hdfs dfs -put teacher.csv /kkb/hdfsload/hivedatas
# 在hive的客户端当中执行
load data inpath '/kkb/hdfsload/hivedatas' overwrite into table myhive.teacher;

 

第10点:hive的分区表

Hive中的分区就是分目录,把表的数据分目录存储,存储在不一样的文件夹下,后期按照不一样的目录查询数据,不须要进行全量扫描,提高查询效率。

建立分区表语法:

create table score(s_id string,c_id string, s_score int) partitioned by (month string) row format delimited fields terminated by '\t';

建立一个表多个分区:

create table score2 (s_id string,c_id string, s_score int) partitioned by (year string,month string,day string) row format delimited fields terminated by '\t';

接下来就是把数据加载到分区表中,老刘以为这些须要掌握,你们认真点!加载数据到分区表当中去

load data  local inpath '/kkb/install/hivedatas/score.csv' into table score partition  (month='201806');

加载数据到多分区表当中去

load data local inpath '/kkb/install/hivedatas/score.csv' into table score2 partition(year='2018',month='06',day='01');

第11点:综合练习

这一点是老刘惟一以为一些资料上讲的不错的地方,在经历了大量的基础DDL操做后,能加速记住这些操做的惟一方法就是作一个小练习,下面就是关于hive基础操做的一个小练习。

需求描述:如今有一个文件score.csv文件,里面有三个字段,分别是s_id string, c_id string,s_score int,字段都是使用 \t进行分割,存放在集群的这个目录下/scoredatas/day=20180607,这个文件天天都会生成,存放到对应的日期文件夹下面去,文件别人也须要公用,不能移动。需求,建立hive对应的表,并将数据加载到表中,进行数据统计分析,且删除表以后,数据不能删除。

根据这些需求,咱们能够知道的是要建立一个外部分区表,可是有意思的是老刘看的资料上,它并非先建表再导入数据,它是先导入数据后再创建表,很是有意思。

cd /kkb/install/hivedatas/
hdfs dfs -mkdir -p /scoredatas/day=20180607
hdfs dfs -put score.csv /scoredatas/day=20180607/

数据文件导入后,再创建外部分区表,并指定文件数据存放目录。

create external table score4(s_id string, c_id string,s_score int) partitioned by (day string) row format delimited fields terminated by '\t' location '/scoredatas';

进行数据查询,发现表里面并无数据。

 

是这样的,若是咱们先创建分区表再经过load导入数据,表里面确定会有数据的;

若是直接将文件放在hdfs上面对应的位置,即便咱们表指定的存储位置和上传数据的位置一致,但因为mysql里面就没有记录元数据分区的信息,就没有数据,就须要进行修复,刷新mysql元数据信息便可。

有一个知识点就是hive的元数据存在于mysql中,在mysql中会有一个hive库,存放相应的表,一共53张表。

固然就像老刘以前说的,先创建表,在经过load导入数据,表里面是绝对有数据的。

02 总结

hive的知识点主要偏实践,在学习过程当中要进行大量的练习,才能真正的掌握。老刘尽可能用大白话对hive的第一部分知识点进行了讲解,但愿可以帮助到你们。有什么想说的,能够直接联系公众号:努力的老刘!

相关文章
相关标签/搜索