Hive

发布于 2022-05-09  380 次阅读


数据仓库

1. 数据仓库(Data Warehouse)的概念

数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。

  1. 面向主题:指数据仓库中的数据是按照一定的主题域进行组织。
  2. 集成:指对原有分散的数据库数据经过系统加工、整理,消除源数据中的不一致性。
  3. 相对稳定:指一旦某个数据进入数据仓库以后只需要定期的加载、刷新。
  4. 反映历史变化:指通过这些信息,对企业的发展历程和未来趋势做出定量分析预测。

数据仓库建设是一个工程,是一个过程,而不是一种可以购买的产品。企业数据处理方式是以联机事务处理形式获取信息,并利用信息进行决策,在信息应用过程中管理信息。

2. 数据仓库与数据库的区别

数据仓库的出现,并不是要取代数据库。目前,大部分数据仓库还是用关系数据库管理系统来管理的。数据仓库与数据库的主要区别在于:

  1. 数据库是面向事务设计的,数据仓库是面向主题设计的。
  2. 数据库一般存储在线交易数据,数据仓库存储的一般是历史数据
  3. 数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余
  4. 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

Hive

Hive 是一种底层封装了 Hadoop 的 数据仓库处理工具,使用类SQL 的 HiveQL 语言实现数据查询,所有Hive 的数据都存储在Hadoop兼容的文件系统中,比如HDFS。Hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。

1. Hive 和 Hadoop 的关系

  1. Hive 构建在 Hadoop 之上。
  2. 所有的数据都是存储在 Hadoop 分布式文件系统中 。
  3. HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的。查询计划被转化为 MapReduce 任务,在 Hadoop 集群上由Yarn执行(有些查询没有执行MapReduce任务,比如:select * from table)。

2. Hive 和普通关系数据库的异同

查询语言 HiveSQL SQL
数据存储位置 HDFS Raw Device 或者本地 FS
数据格式 用户定义 系统决定
数据更新 不支持 支持
索引 新版本支持,但是支持较弱
执行 Mapreduce Executor
执行延迟
可扩展性
数据规模

3.Hive的体系架构 与 运行机制

运行机制

  1. 用户通过用户接口连接 Hive,发布 Hive SQL
  2. Hive 解析查询并制定查询计划
  3. Hive 将查询转换成 MapReduce 作业
  4. Hive 在 Hadoop上执行 MapReduce 作业

Hive编译器的运行机制

4. Hive 的优缺点

Hive的优点

  1. 适合大数据的批量处理,解决了传统关系型数据库在大数据处理上的瓶颈。
  2. Hive构建在Hadoop之上,充分利用了集群的存储资源,计算资源,最终实现并行计算。
  3. Hive学习使用成本低,Hive支持标准的SQL语法,这样就免去了编写MapReduce程序的过程,减少了开发成本.
  4. 具有良好的扩展性,且能够实现和其他组件的结合使用。

Hive的缺点

  1. HQL的表达能力依然有限。由于本身SQL 的不足,不支持迭代计算,有些复杂的运算用 HQL 不易表达,还需要单独编写 MapReduce 来实现,不擅长数据挖掘算法
  2. Hive的运行效率低、延迟高。Hive是转换成MapReduce任务来进行数据的分析的,MapReduce是离线计算,所以Hive的运行效率也是很低的,而且是高延迟的。
  3. Hive的调优比较困难。由于Hive是构建在Hadoop之上的,Hive的调优还要考虑MapReduce层面,所以Hive的整体调优会比较困难。

5. Hive数据类型

基本数据类型

类型 描述 范围
tintint 1个字节(8位)有符号整数 [ -128 , 127 ]
smallint 2个字节(16位)有符号整数 [ -32768 , 32767 ]
int 4个字节(32位)有符号整数 [-2^31 , 2^31-1]
bigint 8个字节(64位)有符号整数 [-2^63 , 2^63-1]
float 4字节(32位)单精度浮点数 [-3.4e38 , 3.4e38]
double 8字节(64位)双精度浮点数 [-1.79e308 , 1.79e308]
boolean true / false
string 字符串 'hive' "Hive"

复杂数据类型

类型 描述 示例
array 一组有序字段。字段的类型必须相同 array(1,2)
map 一组无序的键/值对。键的类型必须是原子的,值可以是任何类型,同一个映射的键的类型必须相同,值的类型必须相同 Map('a',1,'b',2)
struct 一组命名的字段,字段类型可以不同 Struct('a',1,1,0)

6. 常见数据表类型

适用场景
内部表
外部表 当一份日志需要多个小组一起分析,分析完了之后创建的表就可以删除了。但是普通的表删除的同时也会把数据删除,这样就会影响到其他小组的分析,而且日志数据也不能随便删除。所以,需要外部表,删除外部表,不会删除对应的hdfs上的数据。
分区表 适用于大数据量,可以通过分区快速定位需要查询的数据,分区表的作用主要是提高了查询检索的效率。
分桶表 数据有严重的数据倾斜,分布不均匀,但是相对来说每个桶中的数据量会比较平均。桶于桶之间做join等查询的时候,会有优化。

内部表和外部表的区别

  1. 创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
  2. 删除表时︰在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据

分区表与桶表的区别

  1. 从表现形式上:分区表是一个目录,分表是文件
  2. 从创建语句上:分区表使用 partitioned by 子句指定,以指定字段;桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数
  3. 从数量上:分区表的分区个数可以增长,桶表一旦指定,不能再增长
  4. 从作用上:分区避免全表扫描,根据分区列查询指定目录提高查询速度;分桶保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)。分桶表数据进行抽样和JOIN时可以提高MR程序效率

HiveSQL

1. 数据库操作

显示当前数据库

show databases;

创建数据库

CREATE DATABASE [IF NOT EXISTS]db_name;

使用comment关键字为数据库做注释

arete database if not exists db
comment 'my first database';

删除数据库

使用关键字drop删除数据库

drop [db_name]

切换数据库

使用use关键字进行数据库切换

use [db_name]

2. 数据表操作

创建数据表

1.CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常

2.EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)

3.SORTED BY 不常用,对桶中的一个或多个列另外排序

4.LIKE 允许用户复制现有的表结构,但是不复制数据

5.COMMENT 可以为表与字段增加描述

6.PARTITIONED BY 指定分区

7.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, ...)]
  用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe;

8.STORED AS
  SEQUENCEFILE //序列化文件
  | TEXTFILE //普通的文本文件格式
  | RCFILE  //行列存储相结合的文件
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname //自定义文件格式
  如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 

9.LOCATION 指定表在HDFS的存储路径(默认地址/user/hive/warehouse)

1.直接建表

create table if not exists students (
    name string comment 'student name'
    age int comment 'student age'
)
row format delimited
stored as textfile;

2.as 建表

  • as将查询字段以及结果作为一张新表;
  • 使用as创建的表,原表的分区,以及字段的约束等都会丢失(可以通过describe formatted查看);
  • 新表中会将原表的分区当做字段出现在新表中;
    create table stu2
    as
    select * from student where age = 18;

3.like 建表

create tabledb2likedb1;

查看数据表内容

1.查看当前数据库中表

showtable_name;

2.查看其它数据库中的表
1)先切换到要查看的那个数据库,比如:use dajiangtai;然后再使用show tables;

2)直接使用命令:

showtable_nameindb_name;

查看数据表结构信息

desc [formatted]table_name;

formatted查看更详细信息。

修改表

1.对表重命名

alter tabletable_name1totable_name2;

2.对字段(列)重命名、修改字段类型、添加注释、修改字段在表中的位置

alter tabletable_name
change columncol_name1 col_name2 data_type
comment''
aftercol_name3;

3.增加字段(列)

alter tabletable_nameadd column(col_name1 data_type, ...);

4.删除或替换列(整张表)

alter tabletable_namereplace column(col_name1 data_type, ...);

比如通过REPLACE COLUMNS命令删除或替换student01表中的grade和class两个列,具体操作命令及结果如下所示。

5.删除表

drop tabletable_name;

6.内部表与外部表的互相转换

修改内部表为外部表

alter tabletable_nameset tblproperties('EXTERNAL'='TRUE');

修改外部表为内部表
alter tabletable_nameset tblproperties('EXTERNAL'='FALSE');

3. 数据操作

向表中装载数据(load)

load data [local] inpath数据的 path'[overwrite] into tablestudent[partition(partcol1=val1,…)];

  1. load data: 表示加载数据
  2. local: 表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表
  3. inpath: 表示加载数据的路径
  4. overwrite: 表示覆盖表中已有数据,否则表示追加
  5. into table: 表示加载到哪张表
  6. student: 表示具体的表
  7. partition: 表示上传到指定分区

实操案例

1. 创建一张表
create table student(id string, name string) row format delimited fields terminated by '\t';

2.加载本地文件到 hive
load data local inpath '/student.txt' into table student;

2.2 加载数据覆盖表中已有的数据
load data inpath '/student.txt' overwrite into table student;

向表中插入数据

基本数据插入

insert [into/overwrite] tabletable_namevalues(col1_val1,col2_val1),(col1_val2,col2_val2),...;

基本模式插入(根据单张表查询结果)

insert [into/overwrite] tablestudent 查询语句;

  • insert into:以追加数据的方式插入到表或分区,原有数据不会删除
  • insert overwrite:会覆盖表中已存在的数据
  • 注意:insert 不支持插入部分字段

实操案例

insert into table student values(1,'张三'),(2,'李四');

insert overwrite table student select id, name from student;

import 导入数据

外部数据导入到hive表中

import tabletable_namefrom'路径地址';

import table student2 from '/user/local/hive/warehouse/export/student';

insert导出数据

insert overwrite [local] directory'地址路径'[ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t']select * from test;

1. 将查询的结果导出到本地
insert overwrite local directory '/User/hive/student' select * from student;

2. 将查询的结果格式化导出到本地
insert overwrite local directory '/User/hive/student' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from student;

将查询的结果导出到hdfs
insert overwrite directory '/User/hive/student' select * from student;

shell 命令导出数据

bin/hive -e'查询语句'> '路径地址';

bin/hive -e 'select * from default.student;' > /usr/local/hive/data/export/student.txt;

Export导出

将Hive表中的数据,导出到外部

export tabletable_nameto'导出地址路径';

export table default.student to '/user/hive/warehouse/export/student';

清除表数据

清除表数据,保留表结构

truncate tabletable_name;

注意:Truncate 只能删除管理表,不能删除外部表中数据

4. 查询操作

  1. SQL 语言大小写不敏感。
  2. SQL 可以写在一行或者多行
  3. 关键字不能被缩写也不能分行
  4. 各子句一般要分行写