Hive是Facebook为了解决海量⽇志数据的统计分析⽽开发的基于Hadoop的⼀个数据仓库⼯具(后来开源给了Apache软件基⾦会),可以将结构化的数据⽂件映射为⼀张数据库表,并提供类SQL查询功能.HQL。
本质上:将HQL语句转换为MapReduce任务进⾏运⾏(转化流程如下)
主要用途:离线数据分析,比直接使用MapReduce开发效率高效
Hive的优缺点
1)优点
1.操作接⼝采⽤类SQL语法,避免了写MapReduce程序,简单易上⼿,减少开发⼈员学习成本
2.在数据处理⽅⾯,Hive语句最终会⽣成MapReduce任务去计算,常⽤于离线数据分析,对数据实时性要求不⾼的场景
3.在数据存储⽅⾯,它能够存储很⼤的数据集,并且对数据完整性、格式要求并不严格
4.在延展性⽅⾯,Hive⽀持⽤户⾃定义函数,⽤户可以根据⾃⼰的需求来实现⾃⼰的函数
2)缺点
1.Hive的HQL本身表达能⼒有限,不能够进⾏迭代式计算,在数据挖掘⽅⾯也不擅⻓
2.Hive操作默认基于MapReduce引擎,延迟⾼,不适⽤于交互式查询,因此智能化程度低,并且基于SQL调优困难,粒度较粗
Hive架构
1.⽤户接⼝:Client CLI(hive shell)、JDBC/ODBC(java 访问 hive)、WEBUI(浏览器访问 hive)
2.元数据:Metastore 元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在⽬录等;
3.Hadoop 使⽤ HDFS 进⾏存储,使⽤ MapReduce 进⾏计算。
4.驱动器:Driver
(1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这⼀步⼀般都⽤第三⽅⼯具库完
成,⽐如 antlr;对 AST 进⾏语法分析,⽐如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将 AST 编译⽣成逻辑执⾏计划。
(3)优化器(Query Optimizer):对逻辑执⾏计划进⾏优化。
(4)执⾏器(Execution):把逻辑执⾏计划转换成可以运⾏的物理计划。对于 Hive 来说,就是MR/Spark。
Hive 运⾏机制如下图:
Hive 通过给⽤户提供的⼀系列交互接⼝,接收到⽤户的指令(SQL),使⽤⾃⼰的 Driver,
结合元数据(MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执⾏,最后,将执⾏返回的结果输出到⽤户交互接⼝。
Hive与传统数据库对⽐
Hive ⽤于海量数据的离线分析。
Hive 具有sql数据库的外表,但应⽤场景完全不同,Hive 只适⽤于批量数据统计分析。
更直观的对⽐图如下
Hive数据模型
Hive 的数据模型主要有以下四种
内部表与外部表的区别
类型隐式转换
显式转换(CAST,convert)
CAST的语法为cast(value AS TYPE)
如果将浮点型的数据转换成int类型的,内部操作是通过round()或者floor()函数来实现的,⽽不是通过cast实现!
对于BINARY类型的数据,只能将BINARY类型的数据转换成STRING类型。如果你确信BINARY类型数据是⼀个数字类型(a number),这时候你可以利⽤嵌套的cast操作。
对于Date类型的数据,只能在Date、Timestamp以及String之间进⾏转换。下表将进⾏详细的说明:
convert(数据类型,表达式)
使⽤多字符作为分隔符
使⽤MultiDelimitSerDe的⽅法来实现:
CREATE TABLE test_MultiDelimit(id int, name string ,tel string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ("field.delim"="##")
STORED AS TEXTFILE;
使⽤RegexSerDe的⽅法实现:
RegexSerDe 仅⽀持字符串类型的,不能有其他类型
CREATE TABLE test1(id string, name string ,tel string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "^(.*)\\#\\#(.*)$")
STORED AS TEXTFILE;













网友评论