Hive入门全程干货

一、Hive简介

  1. Facebook为了解决海量日志数据的分析而开发了Hive,后来开源给了Apache软件基金会。

  2. Hive是一种用类SQL语句来协助读写、管理那些存储在分布式存储系统上大数据集的数据仓库软件。

  3. Hive的几个特点:

1. Hive最大的特点是通过类SQL来分析大数据,而避免了写MapReduce程序来分析数据,这样使得分析数据更
容易。
2. 数据是存储在HDFS上的,Hive本身并不提供数据的存储功能。
3. Hive是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如MySQL)。
4. 数据存储方面:它能够存储很大的数据集,并且对数据完整性、格式要求并不严格。
5. 数据处理方面:因为Hive语句最终会生成MapReduce任务去计算,所以不适用于实时计算的场景,它适用于
离线分析。

二、Hive架构

Hive的核心

Hive的核心是驱动引擎,驱动引擎由四部分组成:

  • 解释器:解释器的作用是将HiveSQL语句转换为语法树(AST)。
  • 编译器:编译器是将语法树编译为逻辑执行计划。
  • 优化器:优化器是对逻辑执行计划进行优化。
  • 执行器:执行器是调用底层的运行框架执行逻辑执行计划。

Hive的底层存储

Hive的数据是存储在HDFS上的。Hive中的库和表可以看作是对HDFS上数据做的一个映射。所以Hive必须是运行在一个Hadoop集群上的。

Hive语句的执行过程

  • Hive中的执行器,是将最终要执行的MapReduce程序放到YARN上以一系列Job的方式去执行。

Hive的元数据存储

  • Hive的元数据是一般是存储在MySQL这种关系型数据库上的,Hive和MySQL之间通过MetaStore服务交互。
元数据项 说明
DB_ID 数据库的编号
DESC 数据的描述
DB_LOCATION_URI 数据库在HDFS上的目录
NAME 数据库名
OWNER_NAME 创建用户
OWNER_TYPE 创建者的类型
Owner 库、表的所属者
LastAccessTime 最后修改时间
Table Type 表类型(内部表、外部表)
CreateTime 创建时间
Location 存储位置
表的字段信息

Hive有很多种客户端。

  • cli命令行客户端:采用交互窗口,用hive命令行和Hive进行通信。
  • HiveServer2客户端:用Thrift协议进行通信,Thrift是不同语言之间的转换器,是连接不同语言程序间的协议,通过JDBC或者ODBC去访问Hive。
  • HWI客户端:hive自带的一个客户端,但是比较粗糙,一般不用。
  • HUE客户端:通过Web页面来和Hive进行交互,使用的比较多。

三、Hive基本数据类型

Hive支持关系型数据中大多数基本数据类型,同时Hive中也有特有的三种复杂类型。
下面的表列出了Hive中的常用基本数据类型:

数据类型 长度 备注
Tinyint 1字节的有符号整数 -128~127
SmallInt 2个字节的有符号整数 -32768~32767
Int 4个字节的有符号整数 -2147483648 ~ 2147483647
BigInt 8个字节的有符号整数
Boolean 布尔类型,true或者false true、false
Float 单精度浮点数
Double 双精度浮点数
String 字符串
TimeStamp 整数 支持Unix timestamp,可以达到纳秒精度
Binary 字节数组
Date 日期 0000-01-01 ~ 9999-12-31,常用String代替
- - - - - - - - -

四、DDL语法

1. 数据库操作

  1. 创建一个数据库会在HDFS上创建一个目录,Hive里数据库的概念类似于程序中的命名空间,用数据库来组织表,在大量Hive的情况下,用数据库来分开可以避免表名冲突。Hive默认的数据库是default。
  2. hive不能使用关键字、数字开始的字符串来作库表名,不区分大小写。
1.1 创建数据库例子:
hive> create database [if not exists] db1;

[]中的可以不写,判断是否存在

1.2 查看数据库定义:

Describe 命令来查看数据库定义,包括:数据库名称、数据库在HDFS目录、HDFS用户名称。

hive> desc database db1;
OK
db1		hdfs://cluster1/user/hive/warehouse/db1.db	root	USER	
Time taken: 0.059 seconds, Fetched: 1 row(s)

db1是数据库名称。

hdfs://cluster1/user/hive/warehouse/db1.db 是db1库对应的存储数据的HDFS上的根目录。

1.3 查看数据库列表:
hive> show databases;
OK
db1
default
Time taken: 0.036 seconds, Fetched: 2 row(s)
1.4 删除数据库

删除数据库时,如果库中存在数据表,是不能删除的,要先删除所有表,再删除数据库。添加上cascade后,就可以先自动删除所有表后,再删除数据库。(友情提示:慎用啊!)删除数据库后,HDFS上数据库对应的目录就被删除掉了。

    hive> drop database if exists db1 cascade;
1.5 切换当前数据库
  hive> use db1;

2. 表操作

2.1 创建表

内外部表区别:
1、默认创建内部表,创建外部表需要external。
2、一般使用外部表(长期存在的表、数据量大的、不希望把数据块删除的数据),临时表或者确定使用即可清空全部数据(数据库和元数据)则可以使用内部表。
3、内部表删除时将会删除元数据和hdfs中表对应的目录,而外部表删除时只会删除元数据,hdfs中的数据目录保留。
4、alter table userinfo set tblproperties('EXTERNAL'='true'); ###内部表转外部表,true一定要大写;
alter table log3 set tblproperties('EXTERNAL'='false'); ##false大小写都没有关系
分区表:
静态分区:加载数据到指定分区的值。
动态分区:数据未知,根据分区的值来确定需要创建的分区。
混合分区:静态和动态都有。
动态分区的属性:

set hive.exec.dynamic.partition=true #设定动态分区
set hive.exec.dynamic.partition.mode=strict/nonstrict #设定严格模式与否
set hive.exec.max.dynamic.partitions=1000 #设定最大分区数
set hive.exec.max.dynamic.partitions.pernode=100 #设定单节点最大分区数

strict:严格模式必须至少一个静态分区
nonstrict:可以所有的都为动态分区,但是建议尽量评估动态分区的数量。

桶表:

2.1.1 创建普通表(内部表)
    hive> create table if not exists userinfo  
        > (
        >   userid int,
        >   username string,
        >   cityid int,
        >   createtime date    
        > )
        > row format delimited fields terminated by '\t'
        > stored as textfile;
        OK
        Time taken: 2.133 seconds

以上例子是创建表的一种方式,如果表不存在,就创建表userinfo。row format delimited fields terminated by ‘\t’ 是指定列之间的分隔符;stored as textfile是指定文件存储格式为textfile。
创建表一般有几种方式:

  • create table 方式:以上例子中的方式。
  • create table as select 方式:根据查询的结果自动创建表,并将查询结果数据插入新建的表中。
  • create table like tablename1 方式:是克隆表,只复制tablename1表的结构。复制表和克隆表会在下面的Hive数据管理部分详细讲解。
2.1.2 创建外部表

外部表是没有被hive完全控制的表,当表删除后,数据不会被删除。

    hive> create external table iislog_ext (
        >  ip string,
        >  logtime string    
        > )
        > ;
2.1.3 创建分区表

Hive 分区表有
Hive查询一般是扫描整个目录,但是有时候我们关心的数据只是集中在某一部分数据上,比如我们一个Hive查询,往往是只是查询某一天的数据,这样的情况下,可以使用分区表来优化,一天是一个分区,查询时候,Hive只扫描指定天分区的数据。

普通表和分区表的区别在于:一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的。一个分区一个子目录。主要作用是来优化查询性能。(可创建多级分区)

–创建经销商操作日志表

    create table user_action_log
    (
    companyId INT comment   '公司ID',
    userid INT comment   '销售ID',
    originalstring STRING comment   'url', 
    host STRING comment   'host',
    absolutepath STRING comment   '绝对路径',
    query STRING comment   '参数串',
    refurl STRING comment   '来源url',
    clientip STRING comment   '客户端Ip',
    cookiemd5 STRING comment   'cookiemd5',
    timestamp STRING comment   '访问时间戳'
    )
    partitioned by (dt string)
    row format delimited fields terminated by ','
    stored as textfile;

这个例子中,这个日志表以dt字段分区,dt是个虚拟的字段,dt下并不存储数据,而是用来分区的,实际数据存储时,dt字段值相同的数据存入同一个子目录中,插入数据或者导入数据时,同一天的数据dt字段赋值一样,这样就实现了数据按dt日期分区存储。

当Hive查询数据时,如果指定了dt筛选条件,那么只需要到对应的分区下去检索数据即可,大大提高了效率。所以对于分区表查询时,尽量添加上分区字段的筛选条件。

2.1.4 创建桶表

桶表也是一种用于优化查询而设计的表类型。创建通表时,指定桶的个数、分桶的依据字段,hive就可以自动将数据分桶存储。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。举例:

------创建订单表

create table user_leads
(
leads_id string,
user_id string,
user_id string,
user_phone string,
user_name string,
create_time string
)
clustered by (user_id) sorted by(leads_id) into 10 buckets 
row format delimited fields terminated by '\t' 
stored as textfile;

对这个例子的说明:

  • clustered by是指根据user_id的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同user_id的数据放入同一个桶中。而经销商的订单数据,大部分是根据user_id进行查询的。这样大部分情况下是只需要查询一个桶中的数据就可以了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值