一文了解Hive是什么

目录
  • 一、Hive介绍
    • Hive的优缺点
    • Hive架构
      • Hive用户接口
      • Hive元数据的三种存储模式
      • Hive数据存储
      • 架构原理
      • Hive文件格式
    • Hive本质
    • Hive工作原理
    • Hive数据类型

一、Hive介绍

hive: 由 Facebook 开源用于解决海量结构化日志的数据统计工具。

Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。

Hive的优缺点

优点:

  • 类似于SQL语句,简单学习易上手
  • 避免了去写 MapReduce,减少开发人员的学习成本
  • Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合
  • Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高
  • Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数

缺点:

  • Hive 的 HQL 表达能力有限
  • Hive 的效率比较低
  • Hive本质是一个MR

Hive架构

Hive用户接口

  • Hive CLI(Hive Command Line) Hive的命令行
  • HWI(Hive Web Interface) HiveWeb接口
  • Hive提供了Thrift服务,也就是Hiveserver。

Hive元数据的三种存储模式

  • 单用户模式 : Hive安装时,默认使用的是Derby数据库存储元数据,这样不能并发调用Hive。
  • 多用户模式 : MySQL服务器存储元数据
  • 远程服务器模式 : 启动MetaStoreServer

Hive数据存储

Hive数据可区分为表数据元数据,表数据我们都知道是表中的数据,而元数据是用来存储表的名字表分区以及属性

Hive是基于Hadoop分布式文件存储的,它的数据存储在HDFS中。现在我们介绍Hive中常见的数据导入方式

  • 本地文件系统中导入数据到Hive
  • 从HDFS上导入数据到Hive表
  • 从其他表中查询出相应的数据并导入Hive表中
  • 在创建表的时候通过从其他表中查询出相应的记录并插入到所创建的表中
#1.演示从本地装载数据到hive
#1.1创建表
create table student(id string, name string)
row format delimited fields terminated by '\t';
#1.2加载本地的文件到hive
 load data local inpath
'/root/student.txt' into table default.student; #default.test 数据库.表名 也可直接表名
#2.演示加载HDFS文件到hive中
#2.1 将文件上传到HDFS根目录
dfs -put /root/student.txt /;
#2.2加载HDFS上的数据
load data inpath '/student.txt' into table test.student;
#3.加载数据覆盖表中原有的数据
#3.1上传文件到HDFS中
dfs -put /root/student.txt /;  #将文件装载到表下 文件就相当于Windows中的剪切操作
#3.2加载数据覆盖表中原有数据
load data inpath '/student.txt' overwrite into table test.student;
#4.查询表
select * from student;
#通过查询语句向表中插入数据(insert)
#1.1创建表
create table student_par(id int,name String)
row format delimited fields terminated by '\t';
#1.2通过insert插入数据
insert into table student_par values(1,'zhangsan'),(2,'lisi');

架构原理

用户接口

CLI(command-line interface)、JDBC/ODBC(jdbc 访问 hive)、WEBUI(浏览器访问 hive)

元数据

元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等

Hadoop

使用 HDFS 进行存储,使用 MapReduce 进行计算。

驱动器:Driver

(1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,就是 MR/Spark。

Hive文件格式

  • TextFile

这是默认的文件格式。数据不会压缩处理,磁盘开销大,数据解析开销也大。
SequenceFile
这是HadooAPI提供的一种二进制文件支持,以二进制的形式序列化到文件中。

  • RCFile

这种格式是行列存储结构的存储方式。

  • ORC

Optimized Row Columnar ORC文件格式是一种Hadoop生态圈中的列式存储格式。

ORC的优势:

  • 列示存储,有多种文件压缩方式
  • 文件是可分割的。
  • 提供了多种索引
  • 可以支持复杂的数据结构 比如Map

ORC文件格式是以二进制方式存储的,所以是不可直接读取的。

Hive本质

将HQL转换成MapReduce程序。

  • Hive处理的数据存储在HDFS上
  • Hive分析数据底层的实现是MapReduce
  • 执行程序运行在Yarn上

Hive工作原理

简单来说Hive就是一个查询引擎。当Hive接受到一条SQL语句会执行如下操作:

  • 词法分析和语法分析。使用antlr将SQL语句解析成抽象语法树
  • 语义分析。从MetaStore中获取元数据信息,解释SQL语句中的表名、列名、数据类型
  • 逻辑计划生成。生成逻辑计划得到算子树
  • 逻辑计划优化。对算子树进行优化
  • 物理计划生成。将逻辑计划生成出的MapReduce任务组成的DAG的物理计划
  • 物理计划执行。将DAG发送到Hadoop集群进行执行
  • 将查询结果返回。

Hive展现的MapReduce任务设计到组件有:

  • 元存储 : 该组件存储了Hive中表的信息,其中包括了表、表的分区、模式、列及其类型、表映射关系等
  • 驱动 : 控制HiveQL生命周期的组件
  • 查询编辑器
  • 执行引擎
  • Hive服务器
  • 客户端组件 提供命令行接口Hive CLI、Web UI、JDBC驱动等

Hive数据类型

Hive支持两种数据类型,一种原子数据类型、还有一种叫复杂数据类型。

  基本数据类型  
类型 描述 示例
TINYINT 1字节有符合整数 1
SMALLINT 2字节有符号整数 1
INT 4字节有符号整数 1
BIGINT 8字节有符号整数 1
FLOAT 4字节单精度浮点数 1.0
DOUBLE 8字节双精度浮点数 1.0
BOOLEAN true/false true
STRING 字符串 “hive”,‘hive’

Hive类型中的String数据类型类似于MySQL中的VARCHAR。该类型是一个可变的字符串。

Hive支持数据类型转换,Hive是用Java编写的,所以数据类型转换规则遵循Java :

隐式转换 --> 小转大

强制转换 --> 大传小

类型 描述 示例
ARRAY 有序的字段。字符类型必须相同 ARRAY(1,2)
MAP 无序的键值对。建的类型必须是原子的,值可以是任何类型。 Map(‘a’,1,‘b’,2)
STRUCT 一组命名的字段。字段类型可以不同 STRUCT(‘a’,1,1,0)

到此这篇关于一文了解Hive是什么的文章就介绍到这了,更多相关Hive是什么内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-05-17

详解hbase与hive数据同步

hive的表数据是可以同步到impala中去的.一般impala是提供实时查询操作的,像比较耗时的入库操作我们可以使用hive,然后再将数据同步到impala中.另外,我们也可以在hive中创建一张表同时映射hbase中的表,实现数据同步. 下面,笔者依次进行介绍. 一.impala与hive的数据同步 首先,我们在hive命令行执行showdatabases;可以看到有以下几个数据库: 然后,我们在impala同样执行showdatabases;可以看到: 目前的数据库都是一样的. 下面,我们

hive中的几种join到底有什么区别

目录 数据: 1. left join 2. join 3. full join 4. Join…on 1=1 5. union 6. union all union和union all的区别 总结 hive中,几种join的区别 数据: tom,1jey,2lilly,7lilly,8 tom,1lilly,3may,4bob,5 以上两个为数据,没有什么意义,全是为了检测join的使用 看一下两张表,其实可以看出来,在name一行有重复的,也有不重复的,在id一行1表完全包含2表 1. le

解决hive中导入text文件遇到的坑

今天帮一同学导入一个excel数据,我把excel保存为txt格式,然后建表导入,失败!分隔符格式不匹配,无法导入!!!!怎么看两边都是\t,怎么不匹配呢? 做为程序员,最不怕的就是失败,因为我们有一颗勇敢的心!再来!又特么失败... 想了好久,看看了看我的表格式,我犯了一个好低级的错误: hive表的存储格式设置为了orcfile!!! 众所周知:orcfile为压缩格式,可以节约大量存储空间,但orc还有个特点就是不能直接load数据!要想load数据,我们要建一个存储格式为textfile

hive函数简介

首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析. 2.Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提

SQL中 decode()函数简介

DECODE函数,是ORACLE公司的SQL软件ORACLE PL/SQL所提供的特有函数计算方式,以其简洁的运算方式,可控的数据模型和灵活的格式转换而闻名. 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值2,翻译值2,...值

python中set()函数简介及实例解析

set函数也是python内置函数的其中一个,属于比较基础的函数.其具体介绍和使用方法,下面进行介绍. set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. set,接收一个list作为参数 list1=[1,2,3,4] s=set(list1) print(s) #逐个遍历 for i in s: print(i) 输出: set([1, 2, 3, 4]) 1 2 3 4 使用add(key)往集合中添加元素,重复的元素自动过滤 list1

Thinkphp模板中截取字符串函数简介

在php中截取字符串的函数有很多,而在thinkphp中也可以直接使用php的函数,本文给大家简单的介绍thinkPHP模板中截取字符串的具体用法,希望能对各位有所帮助. 对于英文字符可使用如下形式: 复制代码 代码如下: {$vo.title|substr=0,5} 如果是中文字符thinkphp提供了msubstr,用法如下: 复制代码 代码如下: function msubstr($str, $start=0, $length, $charset="utf-8″, $suffix=true

Oracle日期函数简介

Oracle日期函数用于对Oracle数据库中的日期及时间进行处理,下面就为您详细介绍Oracle日期函数的用法,希望对您能有所启迪. (1)SYSDATE和TRUNC 两个Oracle日期函数取Oracle服务器系统的日期和截掉小数部分的功能.观察以下操作: create table test_date (name varchar2(20), p_date date); insert into test_date values('name1',sysdate); select * from t

Oracle文本函数简介

Oracle文本函数使我们常用的函数,下面就为您介绍几种Oracle文本函数的用法,供您参考学习,希望可以让您对Oracle文本函数有更深的认识. (1)UPPER.LOWER和INITCAP 这三个函数更改提供给它们的文体的大小写. select upper(product_name) from product; select lower(product_name) from product; select initcap(product_name) from product; 函数INITC

Python中super()函数简介及用法分享

首先看一下super()函数的定义: super([type [,object-or-type]]) Return a **proxy object** that delegates method calls to a **parent or sibling** class of type. 返回一个代理对象, 这个对象负责将方法调用分配给第一个参数的一个父类或者同辈的类去完成. parent or sibling class 如何确定? 第一个参数的__mro__属性决定了搜索的顺序, sup

WordPress中is_singular()函数简介

函数is_singular()检测结果为true,当下面其一返回true时:is_single().is_page().is_attachment(). 如果指定了$post_types时,还要检测是否是该类型. 函数原型 复制代码 代码如下: is_singular( $post_types = '' ); 参数详解 $post_types,Post type或者在当前query中的类型. 返回值 检测成功返回true,否则返回false. 应用实例 在singular页面下显示不一样的广告:

C++中与输入相关的istream类成员函数简介

eof 函数 eof是end of file的缩写,表示"文件结束".从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(真),否则为0(假). [例] 逐个读入一行字符,将其中的非空格字符输出. #include <iostream> using namespace std; int main( ) { char c; while(!cin.eof( )) //eof( )为假表示未遇到文件结束符 if((c=cin.get( ))!=' ') //

javascript中数组的多种定义方法和常用函数简介

数组的定义:方法1. 复制代码 代码如下: var mycars=new Array()mycars[0]="sharejs.com"mycars[1]="Volvo"mycars[2]="BMW" 方法2.定义和初始化一起: 复制代码 代码如下: var mycars=new Array("Saab","Volvo","BMW"); 或者: 复制代码 代码如下: var mycars=