初识Hive
Posted 安小猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Hive相关的知识,希望对你有一定的参考价值。
文章目录
什么是hive
Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。
Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。
Hive相当于hadoop的客户端工具,部署时不一定放在集群管理节点中,可以放在某个节点上
什么是数据仓库
数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
Hive读写模式
Hive是 读时模式 的:hive在加载数据的时候,并不会检查我们的数据是不是符合规范,只有在读的时候才会根据schema去解析数据
mysql是 写时模式的,符合规范的数据才能被写入
Hive与传统数据库比较
Hive的存储格式
存储格式 | 存储方式 | 特点 |
---|---|---|
TextFile | 行存储 | 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高 |
SequenceFile | 行存储 | 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载 |
RCFile | 数据按行分块 每块按照列存储 | 存储空间最小,查询的效率最高 , 需要通过text文件转化来加载,加载的速度最低。压缩快 快速列存取。读记录尽量涉及到的block最少 ,读取需要的列只需要读取每个row group 的头部定义, 读取全量数据的操作 性能可能比sequencefile没有明显的优势。 |
ORCFile | 数据按行分块 每块按照列存储 | 压缩快,快速列存取 ,效率比rcfile高,是rcfile的改良版本 |
Parquet | 列存储 | 相对于PRC,Parquet压缩比较低,查询效率较低,不支持update、insert和ACID.但是Parquet支持Impala查询引擎 |
Hive的四大常用存储格式存储效率及执行速度对比:ORCFile>Parquet>RCFile>TextFile
Hive数据类型
简单数据类型
整型:TINYINT、SMALLINT、INT、BIGINT
浮点:FLOAT、DOUBLE
布尔类型:BOOL (False/True)
字符串:STRING
时间类型:
- 时间戳 timestamp
- 日期 date
create table testDate(
ts timestamp
,dt date
) row format delimited fields terminated by ',';
// 2021-01-14 14:24:57.200,2021-01-11
复杂数据类型:
- array
create table testArray(
name string,
weight array<string>
)row format delimited
fields terminated by '\\t'
COLLECTION ITEMS terminated by ',';
select name,weight[0] from testArray;
杨老板 140,160,180
张志凯 160,200,180
- map
格式:key:value,key2:v2,k3:v3
create table scoreMap(
name string,
score map<string,int>
)ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';
select name,score['语文'] from scoreMap;
小明 语文:91,数学:110,英语:40
小红 语文:100,数学:130,英语:140
- struct
create table scoreStruct(
name string,
score struct<course:string,score:int,course_id:int,tearcher:String>
)ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\\t'
COLLECTION ITEMS TERMINATED BY ',';
select name,score.course,score.score from scoreStruct;
小明 语文,91,000001,余老师
小红 数学,100,000002,体育老师
Hive JDBC
创建一个Maven项目,并添加依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
启动hiveserver2
hiveserver2
hive --service hiveserver2
编写并运行代码
import java.sql.*;
public class HiveJDBCDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载驱动
Class.forName("org.apache.hive.jdbc.HiveDriver");
// 创建连接(需要先启动 hiveserver2)
// hive --service hiveserver2
Connection conn = DriverManager.getConnection("jdbc:hive2://master:10000/test2");
// 不需要用户名密码,直接创建statement
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select id,name,age,gender,clazz from students limit 10");
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);
String gender = rs.getString(4);
String clazz = rs.getString(5);
System.out.println(id + "," + name + "," + age + "," + gender + "," + clazz);
}
rs.close();
stat.close();
conn.close();
}
}
以上是关于初识Hive的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段