Hive定义
Hive由FaceBook开源用于解决海量数据化日志的数据统计。
Hive 是Hadoop生态系统中必不可少的一个工具。 它可以将存储在HDFS中的结构化数据映射为一张表,并提供了一种SQL方言对其进行查询。 这些sql语句最终会翻译成MapReduce程序执行。
Hive的特点及应用场景
hive是基于Hadoop的应用程序, 受限于Hadoop的设计, Hive不能提供完整的数据功能。 最大的限制就是Hive不支持行级别的更新、插入、或者删除操作。 同时,因为MapReduce的启动过程需要消耗较长的时间, 所有Hive查询延迟比较严重。 传统数据库中秒级别可以完成的查询, 在Hive中即使数据集相对较小, 往往也需要执行更长的时间, 最后需要说明的是, Hive不支持事务。
因此Hive是最适合于数据仓库应用程序,使用该应用程序进行相关的静态数据分析, 不需要快速给出响应结果, 而且数据本身不会频繁变化。。
Hive架构
大家先看一张图
Hive中客户端有这三种:CLI(命令行客户端),HWI(网页客户端),和Thrift Server(编程客户端)。
在客户端输入的所有命令和查询都会进入到Driver(驱动模块)进行解析,编译,优化和执行。
Driver包含SQL Paser, Physcial Plan, Query Optimizer,和Execution四个模块。
SQL Parser是解析器,用于将SQL语句转换为抽象语法树。
Physical Plan 是编译器,用于将抽象语法树编译生成逻辑计划。
Query Optimizer 是优化器, 用于对逻辑执行计划进行优化。
Execution 是执行器,用于把逻辑执行计划转换为可执行的MapReduce程序。
Meta Store(元数据存储)是一个独立的关系型数据库(通常是MySql),Hive会在其中保存表模式和其他系统元数据。
Hive中的库
Hive中数据库的概念本质上仅仅是一个表的一个目录或者命名空间。对于有很多组和用户的大集群, 这是非常有用的, 因为这样可以避免表命名冲突。
举个栗子~ 创建一个库。
CREATE DATABASE school;
如果数据库school已经存在的话, 那么会抛出一个错误信息, 使用以下语句可以避免这种情况!
CREATE DATABASE IF NOT EXISTS school;
可以使用以下命令查看HIve中所包含的数据库;
SHOW DATABASES;
数据库所以目录位于属性 hive.metastore.warehouse.dir 所指定的顶层目录之后。 假设用户使用的是这个属性的默认配置, 也就是/usr/hive/warehouse, 那么当我们创建数据库school的时候, HIve将会对应地创建一个目录/usr/hive/warehouse/school.db。 这里请注意,数据库的文件目录命是以.db结尾的。
USE 命令用于将某个数据库设置用户当前的工作数据库, 和在文 件系统中切换工作目录是一个概念;
USE school;
最后用户可以删除数据库:
DROP DATABASE IF EXITS school CASCADE;
IF EXISTS 子句是可选的,如果加了这个子句, 就可以避免因数据库school不存在而抛出的警告信息。
默认情况下,Hive是不允许删除一个包含有表的数据库。 用户要么先删除数据库中的表再删除数据库, 要么在删除 命令最后加上CASCADE关键字。 CASCADE 关键字可以使Hive自行先删除数据库中的表, 再删除数据库。
Hive 中的表
Hive支持关系数据库中的大多数进本数据类型,同时HIve还支持关系数据库中的不常出现的3中集合数据类型。
数据类型 | 长度 | 例子 |
---|---|---|
TINYINT | 1byte有符号整数 | 10 |
SMALINT | 2byte有符号整数 | 10 |
INT | 4byte有符号整数 | 10 |
BIGINT | 8byte有符号整数 | 10 |
BOOLEAN | 布尔类型,true或者false | TRUE |
FLOAT | 单精度浮点数 | 1.0 |
DOUBLE | 双精度浮点数 | 1.0 |
STRING | 字符串 | ”cat“ |
TIMESTAMP | 日期,时间戳或者字符串 | 132788或者’2020-5-12 13:30:2’ |
ARRAY | 一组有序的字段,类型必须相同 | Array(1,2) |
MAP | 一组 无序的键值对 | Map(‘a’,1’b’,2) |
STRUCT | 一组命名的字段,字段类型可以不同 | Struct(‘a’,1,1,0) |
行转列,列转行
行转列:
CONCAT(string A/col, string B/col…)**:返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,...)**:它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col)**:函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
列转行:
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
Rank函数
RANK() :值相同时,排序相同时会重复,总数不会变。比如,1,2,2,2,5
DENSE_RANK():值相同时,排序相同时会重复,总数会减少。比如,1,2,2,2,3
ROW_NUMBER() :值相同时,排序按照顺序不重复,总数不变。比如,1,2,3,4,5。
PERCENT_RANK:百分比排序
UDF
UDF(User-Defined Functions)即是用户定义HIve函数,当Hive自带的函数不能满足业务需求时,就需要我们的自定义函数了。
Hive中有3三种自定义函数:
UDF:操作单个数据行,产生单个数据行(一进一出)
UDAF:操作多个数据行,产生一个数据行(多进一出)
UDTF:操作一个数据行,产生多个数据行一个表作为输出(一进一出)