初识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注入(代码片段

Hive学习之路 Hive初识

[转帖]Hive学习之路 Hive初识

Hive学习之路 Hive初识

Hive学习之路Hive初识