Hive

364 阅读5分钟

这是我参与更文挑战的第8天 ,活动详情查看更文挑战

Hive定义

Hive 是一种数据仓库技术,用于查询和管理存储在分布式环境下的大数据集。构建于Hadoop的HDFS和MapReduce上,用于管理和查询分析结构化/非结构化数据的数据仓库;

  • 使用HQL(类SQL语句)作为查询接口;
  • 使用HDFS作为底层存储;
  • 使用MapReduce作为执行层,即将HQL语句转译成M/R Job然后在Hadoop执行 Hive的表其实就是HDFS的目录/文件夹,按表名把文件夹分开。如果是分区表,则分区值是子文件夹;

Hive概述—元数据、数据、目录

  • 元数据保存在DB(Derby/MySQL)中,包括表的名字、表的列和分区及其属性,表的属性包括是否为外部表等,表的数据所在目录等;
  • 数据位于集群目录下:
  1. 内部表:/user/hive/warehouse/表名;
  2. 外部表:用户自定的目录;
  • 表的数据即文件(表对应文件夹下);上传文件即相当于上传数据到数据表中;文件可以有多个;表的分区对应子目录;

Hive概述—Hive Shell

Hive Shell 把 HiveQL 查询转换为一系列 MapReduce 作业对任务进行并行处理, 然后返回处理结果。

Hive 采用 RDBMS 表 (table) 形式组织数据 , 并为存储在 Hadoop上的数据提供附属的对数据 进行展示的结构描述信息,该描述信息称为元数据 (metadata)或表模式,以 metastore 形式存储在 RDBMS 数据库中。

Hive使用—内、外部表的区别

两者的相同点:需要指定元数据;都支持分区

不同点:实际数据的存储地点不同

  1. 内部表。实际数据存储在数据仓库目录(默认集群/user/hive/warehouse 下)。删除表时,表中的数据和元数据将会被同时删除。
  2. 外部表。实际数据存储在创建语句location指定的HDFS路径中,不会移动到数据库目录中。如果删除一个外部表,仅会删除元数据,表中的数据不会被删除。

Hive使用—分区Partition

在实际项目中,经常“按天分表 的模式设计数据库!Hive分区类似数据库中相应分区列的一个索引;Hive表中的一个分区对应表下的一个目录,所有分区的数据都存储在各自对应的子目录中

例如:htable包含ds、city两个分区,则相同日期、不同 城市的hdfs目录分别为:

  • /datawarehouse/htable/ds=20100301/city=GZ
  • /datawarehouse/htable/ds=20100301/city=BJ

Hive使用—桶Bucket

桶对指定列进行哈希(hash)计算时,根据哈希值切分数据,每个桶对应一个文件。 例如:将属性列user分散到32个桶中,哈希值为0、10的分别对应的文件为:

  • /datawarehouse/htable/ds=20100301/city=GZ/part-00000
  • /datawarehouse/htable/ds=20100301/city=GZ/part-00010

Hive使用—分区、分桶、索引

  • 索引和分区最大的区别就是索引不分割数据表,分区分割数据表。
  • 分区和分桶最大的区别就是分桶随机分割数据表,分区是非随机分割数据表。

Hive使用—Hive 表 DDL 操作

  1. Create/Drop/Alter 数据库
  2. Create/Drop/Truncate 表
  3. Alter 表/分区/列
  4. Create/Drop/Alter 视图
  5. Create/Drop/Alter 索引
  6. Create/Drop 函数
  7. Create/Drop/Grant/Revoke 角色和权限

Hive使用—Hive 表 DML 操作

  1. 将文件中的数据Load到 Hive 表中
  2. select 操作
  3. 将 select 查询结果插入 hive 表中
  4. 将 select 查询结果写入文件
  5. Hive 表 ACID 事务特性

Hive使用—Hive数据类型

基本数据类型:

  • tinyint/smallint/int/bigint 整数类型
  • float/double 浮点类型
  • boolean 布尔类型
  • string/varchar/char 字符串类型 复杂数据类型:
  • array:数组类型,由一系列相同的数据类型的元素组成
  • map:集合类型,包含key->value键值对,可通过key访问元素。
  • struct:结构类型,可以包含不同数据类型的元素,这些元素可以通过“点语法”的方式来得到所需要的元素。 时间类型:
  • Date: 日期(年月日)
  • Timestamp: 是unix的一个时间偏移量
  • select unix_timestamp(); 查看系统的时间偏移

Hive使用—Hive表操作语法

创建表

image.png

  • external 外部表,类似于mysql的csv引擎
  • partitioned by 指定分区字段
  • clustered by sorted by 可以对表和分区对某个列进行分桶操作,也可以利用sorted by对某个字段进行排序
  • row format delimited fields terminated by ‘\t’ 指定数据行中字段间的分隔符和数据行分隔符
  • stored as 指定数据文件格式:textfile sequence rcfile inputformat (自定义的inputformat 类)
  • location 指定数据文件存放的hdfs目录

内部表建表指令(示例) CREATE TABLE pokes (foo INT, bar STRING) row format delimited fields terminated by ‘\t’;

外部表建表指令(示例) CREATE external TABLE ext_pokes (foo INT, bar STRING) row format delimited fields terminated by ‘\t’ location ‘/data/extpokes’

删除表

  • drop table [IF EXISTS] table_name
  • 删除内部表时会删除元数据和表数据文件
  • 删除外部表(external)时只删除元数据

修改表

image.png

image.png

Hive使用—HiveQL加载数据

加载文件数据:(local 本地、hdfs)文件数据到指定的表分区 LOAD DATA LOCAL INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

从指定表中选取数据插入到其他表中

FROM src 
INSERT OVERWRITE TABLE dest1 SELECT src.* 
WHERE src.key < 100 
INSERT OVERWRITE TABLE dest2 SELECT src.key, 
src.value WHERE src.key >= 100 and src.key < 200