Hive基础

本文详细介绍了Hive的基础知识、安装配置、操作方式、元数据、分区、分桶、JDBC连接、查询语法、内置函数以及优化策略。内容涵盖Hive的SQL语法、数据类型、表操作、内外部表、数据导入导出、窗口函数、UDF和UDTF。特别强调了Hive的优缺点,如操作简单、延迟性高,以及在大数据分析和日志处理中的应用。
摘要由CSDN通过智能技术生成

HIVE

SELECT 12*SAL+NVL(COOM,0) AS SAL_COMM FROM EMP WHERE ENAME='SMITH';
-- NVL(COOM,0) 如果comm是空值,用0代替。

--练习:
--一:将下列数据加载hive表。

--员工信息表emp:
--字段:员工id,员工名字,工作岗位,部门经理,受雇日期,薪水,奖金,部门编号
--英文名:EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,BONUS,DEPTNO

create table emp(
    EMPNO int
    ,ENAME string
    ,JOB string
    ,MGR int
    ,HIREDATE string
    ,SAL int
    ,BONUS int
    ,DEPTNO int
) 
row format delimited
fields terminated by ',';


7369,SMITH,CLERK,7902,1980-12-17,800,null,20
7499,ALLEN,SALESMAN,7698,1981-02-20,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02,2975,null,20,
7654,MARTIN,SALESMAN,7698,1981-09-28,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01,2850,null,30
7782,CLARK,MANAGER,7839,1981-06-09,2450,null,10
7788,SCOTT,ANALYST,7566,1987-04-19,3000,null,20
7839,KING,PRESIDENT,null,1981-11-17,5000,null,10
7844,TURNER,SALESMAN,7698,1981-09-08,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23,1100,null,20
7900,JAMES,CLERK,7698,1981-12-03,950,null,30
7902,FORD,ANALYST,7566,1981-12-03,3000,null,20
7934,MILLER,CLERK,7782,1982-01-23,1300,null,10


1600 1250 2850 1500 950
--部门信息表dept:
--字段:部门编号,部门名称,部门地点
--英文名:DEPTNO,DEPTNAME,DEPTADDR

create table dept(
    DEPTNO int
    ,DEPTNAME string
    ,DEPTADDR string
) 
row format delimited
fields terminated by ',';


10,ACCOUNTING,NEW YORK
10,ACCOUNTING,shanghai
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON


--二:使用HQL完成下面需求:
--1. 列出至少有一个员工的所有部门。
select distinct dept.deptname from emp inner join dept on emp.deptno=dept.deptno; 

--2. 列出薪金比“SMITH”多的所有员工。
SELECT T1.EMPNO,T1.ENAME,T1.SAL_BONUS FROM (SELECT EMPNO,ENAME,12*SAL+NVL(BONUS,0) AS SAL_BONUS,1 AS TEMP_ID FROM EMP) AS T1 JOIN (SELECT 12*SAL+NVL(BONUS,0) AS SAL_BONUS,1 AS TEMP_ID FROM EMP WHERE ENAME='SMITH') AS T2 ON (T1.TEMP_ID=T2.TEMP_ID) WHERE T1.SAL_BONUS>T2.SAL_BONUS;

-- 美化后
SELECT T1.EMPNO,
        T1.ENAME,
        T1.SAL_BONUS
FROM 
    (SELECT EMPNO,
        ENAME,
        12*SAL+NVL(BONUS,
        0) AS SAL_BONUS,
        1 AS TEMP_ID
    FROM EMP) AS T1
JOIN 
    (SELECT 12*SAL+NVL(BONUS,
        0) AS SAL_BONUS,
        1 AS TEMP_ID
    FROM EMP
    WHERE ENAME='SMITH') AS T2
    ON (T1.TEMP_ID=T2.TEMP_ID)
WHERE T1.SAL_BONUS>T2.SAL_BONUS; 

--3. 列出所有员工的姓名及其直接上级的姓名。
SELECT EMP1.ENAME,EMP2.ENAME FROM EMP AS EMP1 LEFT JOIN EMP AS EMP2 ON EMP1.MGR=EMP2.EMPNO; 

--4. 列出受雇日期早于其直接上级的所有员工。
SELECT EMP1.ENAME FROM EMP AS EMP1 LEFT JOIN EMP AS EMP2 ON EMP1.MGR=EMP2.EMPNO WHERE EMP1.HIREDATE<EMP2.HIREDATE; 

--5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
 SELECT DEPT.DEPTNO,DEPT.DEPTNAME,EMP.ENAME,EMP.JOB FROM EMP RIGHT JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO ORDER BY DEPTNO; 

--6. 列出所有“CLERK”(办事员)的姓名及其部门名称。
 SELECT EMP1.ENAME,EMP1.JOB,DEPT.DEPTNO,DEPT.DEPTNAME FROM (SELECT EMP.ENAME,EMP.DEPTNO,EMP.JOB FROM EMP WHERE EMP.JOB='CLERK') AS EMP1 INNER JOIN DEPT ON EMP1.DEPTNO=DEPT.DEPTNO;

--7. 列出最低薪金大于1500的各种工作。
 SELECT JOB FROM EMP WHERE SAL>1500;

--8. 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号
SELECT E.ENAME FROM EMP AS E INNER JOIN (SELECT DEPTNO FROM DEPT WHERE DEPTNAME='SALES') AS D ON E.DEPTNO=D.DEPTNO;

--9. 列出薪金高于公司平均薪金的所有员工。 

--10.列出与“SCOTT”从事相同工作的所有员工。

--11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。

--12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 

--13.列出在每个部门工作的员工数量、平均工资和平均服务期限。

--14.列出所有员工的姓名、部门名称和工资。 

--15.列出所有部门的详细信息和部门人数。 

--16.列出各种工作的最低工资。 

--17.列出各个部门的MANAGER(经理)的最低薪金。

--18.列出所有员工的年工资,按年薪从低到高排序。

--19. 列出每个部门薪水前两名最高的人员名称以及薪水。(思考:用开窗函数解决)

--20. 列出每个员工从受雇开始到2018-12-12 为止共受雇了多少天。

Hive1.2.1学习(一)

1、Hive基本概念

1.1 Hive简介

Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步说hive就是一个MapReduce客户端。

思考:计算文件user.txt中张三出现几次,使用mapreduce怎么写,然后再比照下图的hive实现过程

在这里插入图片描述

在这里插入图片描述

为什么使用Hive?

如果直接使用hadoop的话,人员学习成本太高,项目要求周期太短,MapReduce实现复杂查询逻辑开发难度太大。如果使用hive的话,可以操作接口采用类SQL语法,提高开发能力,免去了写MapReduce,减少开发人员学习成本,功能扩展很方便(比如:开窗函数)。

Hive的特点:

1、可扩展性

​ Hive可以自由的扩展集群的规模,一般情况下不需要重启服务

2、延申性

​ Hive支持自定义函数,用户可以根据自己的需求来实现自己的函数

3、容错

​ 即使节点出现错误,SQL仍然可以完成执行

Hive的优缺点:

优点:

​ 1、操作接口采用类sql语法,提供快速开发的能力(简单、容易上手)

​ 2、避免了去写MapReduce,减少开发人员的学习成本

​ 3、Hive的延迟性比较高,因此Hive常用于数据分析,适用于对实时性要求不高的场合

​ 4、Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。(不断地开关JVM虚拟机)

​ 5、Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

​ 6、集群可自由扩展并且具有良好的容错性,节点出现问题SQL仍可以完成执行

缺点:

​ 1、Hive的HQL表达能力有限

​ (1)迭代式算法无法表达 (反复调用,mr之间独立,只有一个map一个reduce,反复开关)

​ (2)数据挖掘方面不擅长

​ 2、Hive 的效率比较低

​ (1)Hive 自动生成的 MapReduce 作业,通常情况下不够智能化

​ (2)Hive 调优比较困难,粒度较粗 (hql根据模板转成mapreduce,不能像自己编写mapreduce一样精细,无法控制在map处理数据还是在reduce处理数据)

Hive和传统数据库对比

在这里插入图片描述

Hive应用场景

日志分析:大部分互联网公司使用hive进行日志分析,如百度、淘宝等。

​ 统计一个网站一个时间段内的pv,uv,SKU,SPU

​ 多维度数据分析

海量结构化数据离线分析

构建数据仓库

PV(Page View)访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。

UV(Unique Visitor)独立访客,统计1天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的。如果用户不保存cookies访问、清除了cookies或者更换设备访问,计数会加1。00:00-24:00内相同的客户端多次访问只计为1个访客。

1.2 Hive架构

在这里插入图片描述

1.2.1 Client

Hive允许client连接的方式有三个CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问 hive)。JDBC访问时中间件Thrift软件框架,跨语言服务开发。DDL DQL DML,整体仿写一套SQL语句。

​ 1)client–需要下载安装包

​ 2)JDBC/ODBC 也可以连接到Hive
​ 现在主流都在倡导第二种 HiveServer2/beeline
​ 做基于用户名和密码安全的一个校验

​ 3)Web Gui
​ hive给我们提供了一套简单的web页面
​ 我们可以通过这套web页面访问hive 做的太简陋了

1.2.2 Metastore

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

​ 一般需要借助于其他的数据载体(数据库)

​ 主要用于存放数据库的建表语句等信息

​ 推荐使用Mysql数据库存放数据

​ 连接数据库需要提供:uri username password driver

1.2.3 Driver

元数据存储在数据库中,默认存在自带的derby数据库(单用户局限性)中,推荐使用Mysql进行存储。

​ 1) 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完 成,比如ANTLR;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

​ 2) 编译器(Physical Plan):将AST编译生成逻辑执行计划。

​ 3) 优化器(Query Optimizer):对逻辑执行计划进行优化。

​ 4) 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是 MR/Spark。

1.2.4 数据处理

Hive的数据存储在HDFS中,计算由MapReduce完成。HDFS和MapReduce是源码级别上的整合,两者结合最佳。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。

1.3 Hive的安装

在之前博客中我有记录安装JDK和Hadoop和Mysql的过程,如果还没有安装,请先进行安装配置好,对应的随笔我也提供了百度云下载连接。

安装JDK: https://www.cnblogs.com/wyh-study/p/12014368.html

安装Hadoop https://www.cnblogs.com/wyh-study/p/12043948.html

安装Mysql https://www.cnblogs.com/wyh-study/p/12044652.html

(注意:安装mysql的时候一定要确保已经执行 :

1.3.1 上传压缩包并解压
tar -zxvf apache-hive-1.2.1-bin.tar.gz
1.3.2 修改目录名称
mv apache-hive-1.2.1-bin hive-1.2.1
1.3.3 备份配置文件
cp hive-env.sh.template hive-env.sh

cp hive-default.xml.template hive-site.xml
1.3.4 修改配置hive的配置文件(在conf目录下)

修改hive-env,sh

加入三行内容(大家根据自己的情况来添加,每个人安装路径可能有所不同)

HADOOP_HOME=/usr/local/soft/hadoop-2.7.6
JAVA_HOME=/usr/local/soft/jdk1.8.0_171
HIVE_HOME=/usr/local/soft/hive-1.2.1

修改hive-site.xml (找到对应的键对值进行修改,注意!!!是修改,而不是全部直接复制粘贴)

<!--数据存储位置就是我们在HDFS上看的目录-->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>

(注意:修改自己安装mysql的主机地址)
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.40.110:3306/hive?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</value>
</property>

(固定写法,mysql驱动类的位置)
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

(mysql的用户名)
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>


(mysql的用户密码)
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>

 
(你的hive安装目录的tmp目录)
<property>
<name>hive.querylog.location</name>
<value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>

 
(同上)
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>


(同上)
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>

<!--指定这个的时候,为了启动metastore服务的时候不用指定端口-->
<!--hive --service metastore -p 9083 & | hive --service metastore-->
<property>
    <name>hive.metastore.uris</name>
    <value/>
    <description>thrift://master:9083</description>
</property>

修改core-site.xml 直接改,改完重启就行,为后面beeline连接做准备

注意:三个节点上的都要改。

<!--该参数表示可以通过httpfs接口hdfs的ip地址限制-->
<property>
 <name>hadoop.proxyuser.hadoop.hosts</name>
 <value>*</value>
</property>
<!--通过httpfs接口访问的用户获得的群组身份-->
<property>
 <name>hadoop.proxyuser.hadoop.groups</name>
 <value>*</value>
</property>
1.3.5 拷贝mysql驱动到$HIVE_HOME/lib目录下
cp /usr/local/soft/mysql-connector-java-5.1.49.jar ../lib/
1.3.6 将hadoop的jline-0.9.94.jar的jar替换成hive的版本。
cp /usr/local/soft/hive-1.2.1/lib/jline-2.12.jar /usr/local/soft/hadoop-2.7.6/share/hadoop/yarn/lib/
1.3.7 将hive的bin目录配置到环境变量中去
export HIVE_HOME=/usr/local/soft/hive-1.2.1
export PATH=.:$HIVE_HOME/bin

在这里插入图片描述

1.3.8 source命令让环境变量生效

在这里插入图片描述

1.3.9 拷贝到其他两个节点中去,因为可能我们会在其他的节点上当作客户端访问hive,注意,也需要配置环境变量,增加驱动jar包,将hadoop的jline-0.9.94.jar的jar替换成hive的版本
1.3.10 启动

启动hadoop

start-all.sh

启动hive

​ hive --service metastore

​ nohup hive --service metastore >/dev/null &

​ hive

启动HiveServer2

​ hiveserver2

​ nohup hiveserver2 >/dev/null &

​ beeline -u jdbc:hive2://master:10000 -n root

1.4 Hive的三种交互方式

1)第一种交互方式

shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。

服务端启动metastore服务(后台启动):nohup hive --service metastore > /usr/local/soft/mylogs 2>&1 &
进入命令:hive
退出命令行:quit;

2)第二种交互方式

Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器,来完成访问操作,这是生产环境用法最多的

服务端启动hiveserver2服务:
nohup hive --service metastore >/dev/null &
nohup hiveserver2 >/dev/null &
客户端输入
beeline -u jdbc:hive2://master0:10000 -n root

需要稍等一下,启动服务需要时间:
进入命令:1)先执行: beeline ,再执行: !connect jdbc:hive2://master:10000 
        2)或者直接执行:  beeline -u jdbc:hive2://master:10000 -n root
退出命令行:!exit

3)第三种交互方式

使用 –e 参数来直接执行hql的语句

bin/hive -e "show databases;"

使用 –f 参数通过指定文本文件来执行hql的语句

特点:执行完sql后,回到linux命令行。

vim hive.sql

use myhive;
select * from test;
hive -f hive.sql

4)hive cli和beeline cli的区别

在这里插入图片描述

1.5 Hive元数据

Hive元数据库中一些重要的表结构及用途,方便Impala、SparkSQL、Hive等组件访问元数据库的理解。

1、存储Hive版本的元数据表(VERSION),该表比较简单,但很重要,如果这个表出现问题,根本进不来Hive-Cli。比如该表不存在,当启动Hive-Cli的时候,就会报错“Table ‘hive.version’ doesn’t exist”

2、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)

​ DBS:该表存储Hive中所有数据库的基本信息。

​ DATABASE_PARAMS:该表存储数据库的相关参数。

3、Hive表和视图相关的元数据表

​ 主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。
​ TBLS:该表中存储Hive表,视图,索引表的基本信息。
​ TABLE_PARAMS:该表存储表/视图的属性信息。
​ TBL_PRIVS:该表存储表/视图的授权信息。
4、Hive文件存储信息相关的元数据表

​ 主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS,由于HDFS支持的文件格式很多,而建Hive表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格式去读写HDFS文件,而这些信息就保存在这几张表中。
​ SDS:该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。TBLS表中的SD_ID与该表关联,可以获取Hive表的存储信息。
​ SD_PARAMS: 该表存储Hive存储的属性信息。
​ SERDES:该表存储序列化使用的类信息。
​ SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符。
5、Hive表字段相关的元数据表

​ 主要涉及COLUMNS_V2:该表存储表对应的字段信息。

2、Hive的基本操作

2.1 Hive库操作

2.1.1 创建数据库

1)创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/*.db

create database testdb;

2)避免要创建的数据库已经存在错误,增加if not exists判断。(标准写法)

create database if not exists testdb; 
2.2.2 创建数据库和位置
create database if not exists dept location '/testdb.db';
2.2.3 修改数据库

数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。

alter database dept set dbproperties('createtime'='20220531');
2.2.4 数据库详细信息

1)显示数据库(show)

show databases;

2)可以通过like进行过滤

show databases like 't*';

3)查看详情(desc)

desc database testdb;

4)切换数据库(use)

use testdb;
2.2.5 删除数据库

1)最简写法

drop database testdb;

2)如果删除的数据库不存在,最好使用if exists判断数据库是否存在。否则会报错:FAILED: SemanticException [Error 10072]: Database does not exist: db_hive

drop database if exists testdb;

3)如果数据库不为空,使用cascade命令进行强制删除。报错信息如下FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)

drop database if exists testdb cascade;

2.2 Hive数据类型

2.2.1 基础数据类型
类型 Java数据类型 描述
TINYINT byte 8位有符号整型。取值范围:-128~127。
SMALLINT short 16位有符号整型。取值范围:-32768~32767。
INT int 32位有符号整型。取值范围:-2 31 ~2 31 -1。
BIGINT long 64位有符号整型。取值范围:-2 63 +1~2 63 -1。
BINARY 二进制数据类型,目前长度限制为8MB。
FLOAT float 32位二进制浮点型。
DOUBLE double 64位二进制浮点型。
DECIMAL(precision,scale) 10进制精确数字类型。precision:表示最多可以表示多少位的数字。取值范围:1 <= precision <= 38。scale:表示小数部分的位数。取值范围: 0 <= scale <= 38。如果不指定以上两个参数,则默认为decimal(10,0)。
VARCHAR(n) 变长字符类型,n为长度。取值范围:1~65535。
CHAR(n) 固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。
STRING string 字符串类型,目前长度限制为8MB。
DATE 日期类型,格式为yyyy-mm-dd。取值范围:0000-01-01~9999-12-31。
DATETIME 日期时间类型。取值范围:0000-01-01 00:00:00.000~9999-12-31 23.59:59.999,精确到毫秒。
TIMESTAMP 与时区无关的时间戳类型。取值范围:0000-01-01 00:00:00.000000000~9999-12-31 23.59:59.999999999,精确到纳秒。说明 对于部分时区相关的函数,例如cast( as string),要求TIMESTAMP按照与当前时区相符的方式来展现。
BOOLEAN boolean BOOLEAN类型。取值:True、False。
2.2.2 复杂的数据类型
类型 定义方法 构造方法
ARRAY array<int>``array<struct<a:int, b:string>> array(1, 2, 3)``array(array(1, 2), array(3, 4))
MAP map<string, string>``map<smallint, array<string>> map(“k1”, “v1”, “k2”, “v2”)``map(1S, array(‘a’, ‘b’), 2S, array(‘x’, ‘y’))
STRUCT struct<x:int, y:int>struct<field1:bigint, field2:array<int>, field3:map<int, int>> named_struct(‘x’, 1, ‘y’, 2)named_struct(‘field1’, 100L, ‘field2’, array(1, 2), ‘field3’, map(1, 100, 2, 200))

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。还有一个uniontype< 所有类型,所有类型… > 。

​ 数组:array< 所有类型 >;
​ Map < 基本数据类型,所有数据类型 >;
​ struct < 名:所有类型[注释] >;
​ uniontype< 所有类型,所有类型… >

2.3 Hive表操作

Hive的存储格式:

Hive没有专门的数据文件格式,常见的有以下几种:

TEXTFILE
​ SEQUENCEFILE
​ AVRO
RCFILE
ORCFILE
PARQUET

TextFile:
       TEXTFILE 即正常的文本格式,是Hive默认文件存储格式,因为大多数情况下源数据文件都是以text文件格式保存(便于查看验数和防止乱码)。此种格式的表文件在HDFS上是明文,可用hadoop fs -cat命令查看,从HDFS上get下来后也可以直接读取。
        TEXTFILE 存储文件默认每一行就是一条记录,可以指定任意的分隔符进行字段间的分割。但这个格式无压缩,需要的存储空间很大。虽然可结合Gzip、Bzip2、Snappy等使用,使用这种方式,Hive不会对数据进行切分,从而无法对数据进行并行操作。
一般只有与其他系统由数据交互的接口表采用TEXTFILE 格式,其他事实表和维度表都不建议使用。

RCFile:
Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。 RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据`列式存储`,有利于数据压缩和快速的列存取。

ORCFile:
Hive从0.11版本开始提供了ORC的文件格式,ORC文件不仅仅是一种列式文件存储格式,最重要的是有着很高的压缩比,并且对于MapReduce来说是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅可以很大程度的节省HDFS存储资源,而且对数据的查询和处理性能有着非常大的提升,因为ORC较其他文件格式压缩比高,查询任务的输入数据量减少,使用的Task也就减少了。ORC能很大程度的节省存储和计算资源,但它在读写时候需要消耗额外的CPU资源来压缩和解压缩,当然这部分的CPU消耗是非常少的。

Parquet:
通常我们使用关系数据库存储结构化数据,而关系数据库中使用数据模型都是扁平式的,遇到诸如List、Map和自定义Struct的时候就需要用户在应用层解析。但是在大数据环境下,通常数据的来源是服务端的埋点数据,很可能需要把程序中的某些对象内容作为输出的一部分,而每一个对象都可能是嵌套的,所以如果能够原生的支持这种数据,这样在查询的时候就不需要额外的解析便能获得想要的结果。Parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能。Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定。这也是parquet相较于orc的仅有优势:支持嵌套结构。Parquet 没有太多其他可圈可点的地方,比如他不支持update操作(数据写成后不可修改),不支持ACID等.

SEQUENCEFILE:
SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。 SequenceFile最重要的优点就是Hadoop原生支持较好,有API,但除此之外平平无奇,实际生产中不会使用。

AVRO:
Avro是一种用于支持数据密集型的二进制文件格式。它的文件格式更为紧凑,若要读取大量数据时,Avro能够提供更好的序列化和反序列化性能。并且Avro数据文件天生是带Schema定义的,所以它不需要开发者在API 级别实现自己的Writable对象。Avro提供的机制使动态语言可以方便地处理Avro数据。最近多个Hadoop 子项目都支持Avro 数据格式,如Pig 、Hive、Flume、Sqoop和Hcatalog。

Hive的四大常用存储格式存储效率及执行速度对比

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值