Hive入门

Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。

那什么是数据仓库呢?

数据仓库是一个面向主题的,集成的,不可更新的,随时间不变化的数据集合,它用于支持企业或组织的决策分析处理(主要是查询操作),数据仓库实际上就是一个数据库,可以利用数据仓库来保存数据,但是数据仓库有别于我们一般的数据库

数据仓库的结构和建立过程

数据源(业务数据系统,文档资料,其他数据)
数据存储和管理(ETL,抽取Extract,转换Transform,装载Load)
数据仓库引擎
前端展示(数据查询,数据报表,数据分析,各类应用)

什么是Hive?

  • hive是建立在hadoop hdfs上的数据仓库基础架构,hive中的表和文件其实就是hdfs中的目录和文件
  • hive可以用来进行数据提取转化加载(ETL)
  • hive定义了简单的类似SQL查询语言(HQL),它允许熟悉SQL的用户查询数据
  • hive允许熟悉MapReduce开发者开发自定义的mapper和reducer来处理內建的mapper和reducer无法完成的复杂的分析工作
  • hive是SQL解析引擎,它将SQL语句转义成MapReduce Job然后在hadoop上执行

hive的元数据

hive将元数据存储在数据库中(metastore),支持mysql和derby(默认)等数据库
hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等

HQL的执行过程

解释器,编译器,优化器完成HQL查询语句从此法分析,语法分析,编译,优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS中,并在随后又MapReduce调用执行

HQL执行过程如下:

  1. HQL select语句
  2. 解释器进行此法分析
  3. 编译器生成HQL的执行计划(类似javac命令,将java文件编译成class文件)
  4. 优化器生成最佳的执行计划
  5. 执行

hive的三种安装模式

  1. 嵌入模式

    • 元数据信息保存在hive自带的derby数据库中
    • 只允许创建一个连接
    • 多用于Demo
  2. 本地模式

    • 元数据信息被存储在MySQL数据库中
    • MySQL数据库与Hive运行在同一台物理机器上
    • 多用于开发和测试
  3. 远程模式

    • 元数据信息被保存在远程的MySQL数据库中
    • 多用于实际的生产运行环境

常用的CLI命令

  • 进入CLI

    • 交互模式
      hive # 进入命令行交互模式,非静默
      hive -S # 静默模式,不显示调试信息

    • 直接执行一条语句
      hive -e ‘show tables’;

    • 执行一个文件的文件
      hive -f ~/test.hql

  • 清屏

    • Ctrl + L或者 !clear;
  • 查看数据仓库中的表

    • show tables;
  • 查看数据仓库中内置的函数

    • show functions;
  • 查看表的结构

    • desc 表名
  • 查看HDFS上的文件

    • dfs -ls 目录
  • 执行操作系统的命令

    • !命令
  • 执行HQL语句

    • select from
  • 执行SQL的脚本

    • source SQL文件

hive的数据类型

  • 基本数据类型

    • tinyint/smallint/int/bigint:整数类型
    • float/double:浮点数类型
    • boolean:布尔类型
    • string:字符串类型
  • 复杂数据类型

    • Array:数组类型,由一系列相同数据类型的元素组成
    • Map:集合类型,包含key->value,可以通过key来访问元素
    • Struct:结构类型,可以包含不同数据类型的元素,这些元素可以通过“点语法”的方式来得到所需要的元素
  • 时间类型

    • Date:从Hive0.12.0开始支持
    • Timestamp:从Hive0.8.0开始支持
1
2
3
4
5
6
7
CREATE TABLE employees(
name STRING,
salary FLOAT,
subordintes ARRAY<STRING>,
deucations MAP<STRING, FLOAT>
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)

Hive中的数据都是保存在HDFS中
没有专门的数据存储格式
存储结构主要包括:数据库,文件,表,视图
Hive可以直接加载文本文件
创建表的时候,指定Hive数据的列分隔符与行分隔符

数据库database
  • 相当于关系数据库中的命名空间(namespace),它的作用是将用户和数据库的应用隔离到不同的数据库或模式中

  • Table内部表

    • 与数据库中的Table在概念上是类似的
    • 每一个Table在Hive中都有一个相应的目录存储数据
    • 所有的Table数据(不包括External Table)都保存在这个目录中
    • 删除表的时候,元数据与数据都会被删除
  • Partition分区表

    • Partition对应于数据库的Partition列的密集索引
    • 在Hive中,表中的一个Partition对应于表下的一个目录,多有的Partition的数据都存储在对应的目录中
    • 在数据量特别大的时候,需要将数据按照一定的条件进行分区,这样在进行查询操作的时候能够降低扫描的数据,从而提高查询的效率(通过执行计划知道)
    • Hive把表组织成”分区“,这是一种根据“分区列”(如日期)的值对表的数据进行粗略划分的机制。使用分区可以加快数据分片(slice)的查询速度
  • External Table 外部表

    • 指向已经存在于HDFS中的数据,也可以创建Patition
    • 它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异
    • 外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只是与外部数据建立一个链接。当删除一个外部表是,仅删除该链接
  • Bucket Table 桶表

    • 桶表是对数据进行哈希取值,然后放到不同文件中存储
    • 降低系统的热块,从而提高查询的速度
    • 表和分区可以进一步分为“桶”,它会为数据提供额外的结构以获得更高效的查询处理。例如,可以根据用户ID来划分桶,这则是对数据源数据文件本身来拆分数据。使用桶的表会将源数据文件按一定规律拆分成多个文件,要使用bucket

视图

  • 视图是一种虚表,是一个逻辑概念,不存数据;可以跨越多张表
  • 视图建立在已有表的基础上,视图赖以建立的这些表成为基表
  • 视图可以简化复杂的查询

内部表和外部表的区别?

内部表也叫做管理表,Hive会控制着数据的生命周期,默认情况下会将这些表的数据存储在由配置项hive.metastore.warehourse.dir所定义的目录的子目录下
当删除一个内部表的时候,Hive也会删除这个表中的数据

外部表
先看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
create external table if not exists pimaccess(
accesstime BIGINT,
account STRING,
ip STRING,
appkey STRING,
prelinkmannum INT,
aftlinkmannum INT,
pregroupnum INT,
aftgroupnum INT,
resultcode INT,
costtime INT,
requesttype INT,
responsetype INT,
apiname STRING,
requestdata STRING,
responsedata STRING,
rtime STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/pimaccess';

在创建表的时候使用EXTENAL关键字,用来告诉Hive这个表是外部表,LOCATION子句则用于告诉Hive数据位于哪个路径下。
对于外部表,Hive认为没有完全拥有这份数据,因此在删除该表的时候不会删除掉这份数据,不过描述表的元数据信息会被删除。

Hive常见的数据导入方式

  • 从本地文件系统中导入

    • load data local inpath ‘test.txt’ into table test;
    • load data local inpath ‘test.txt’ overwrite into table test;
  • 从HDFS上导入

    • load data inpath ‘/test.txt’ into table test;
    • load data inpath ‘/test.txt’ overwrite into table test;
  • 从别的表中查询出相应数据并导入

    • insert into table test partition(age=’25’) select id, name, tel from test;
  • 在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中

    • create table test2 as select id, name, tel from test;