Hive全面深入理解

2024-09-06 05:48
文章标签 全面 深入 理解 hive

本文主要是介绍Hive全面深入理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文分为几个模块:

  1. 概述
  2. 体系架构简介
  3. 安装步骤
  4. 开发

1:概述

建立在Hadoop基础之上的数据仓库基础架构,通俗来说,就是数据管理的工具,可以通过编写类似于常用SQL的HQL查询语句,实现大规模数据的查询和处理,而底层则是用MapReduce来完成提交的语句的处理;也就是说,Hive的功能,很多也可以通过自己开发MapReduce程序来处理;数据的存储,则是依据HDFS来完成的。

Hive的核心功能是SQL语句解析引擎,而其中的表,实际上就是HDFS的目录和文件,按照表名来把文件夹分开。

2:体系架构简介


对于本图来说,实际上Hive就相当于一个SQL语言引擎,将用户提交出的SQL语句,解析成MapReduce程序,由底层的Hadoop来执行。
对于用户来说,有三种接口方式:
  1. CLI:命令行方式,
  2. JDBC/ODBC:通过类似于MySQL接口的方式进行访问
  3. Web GUI:通过HTTP页面进行访问。
2:Hive支持的数据类型

INT

TINYINT/SMALLINT/BIGINT

BOOLEAN

FLOAT

DOUBLE

STRING 

BINARY

TIMESTAMP

ARRAY, MAP, STRUCT, UNION

DECIMAL

3:常见的一些HQL语

通过加载本地文件创建表:load data local inpath './home/test.txt' override into table pokes

通过加载HDFS文件,并且分区建表:load data inpath '/wordcount/output.txt' override into table pokes partition(times = 5)

查询语句

  1. 查询一行:select * from student a where a.id = 10;
  2. 查询一行中的某一列: select a.first_col from student a where a.id = 10
  3. 向HDFS中插入数据:insert override directory '/home/tmp' select a.* > 10 from student a.ds= "shanghai";这里是可以指定分区的
  4. 从一个表中获取数据插入到另一个表中:FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;

Join操作:FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;这种操作就比较厉害了,而且使用也比较灵活

创建新表1:create table student (name STRING,age INT ,sex INT) row format delimited fields by ',' stored as testfile.

创建新表2:create table student (name STRING , age INT , sex INT) row format delimited fields by ';' lines terminated by '\n';默认情况下,数据是按照行来分的,所以如无特别要求,无需指定;而每一行的字段划分,则是必须要指定的。

创建附加注释的表:create external table student(name String comment 'the name of student', age Int 'the age of student', sex Int) comment 'this is a student basic information table' row format delimited fields by ',' STORED AS TEXTFILE LOCATION 'hdfs://localhost:9000'

Hive表的修改

  1. 添加新的一列:ALTER TABLE pokes add columns(address String)
  2. 添加一列并同时添加注释:alter table pokes add columns(address STRING COMMENT 'address comment')
  3. 删除表:drop table pokes
  4. 更改表名:alter table pokes rename to another

Hive的分区和分桶

创建分区表:create table tb_partition(id String, name String) PARTITIONED BY(month String) row format delimited fields terminated by ';'这就创建了一张分区表,按照month的不同来进行分区;在查询的过程中,也可以指定分区,这样检索的范围缩小,性能提高。

加载数据到分区表中:

  1. load data local inpath '/home/files/dealedlog.out' overwrite into table tb_partition partition(month = '201802');这里,通过local inpath指定了加载的是本地文件,overwrite代表数据直接覆盖到tb_partition表中;而month则是指定文件加载到month='201802'的分区中。
  2. insert select方式:insert into table tb_partition partition(month = '201802') select id ,name from name;该语句就是从name表获取两列数据,插入到tb_partition表中,并指定数据存储的分区为month=‘201802’
  3. 由于Hive实际上加载的就是HDFS文件,所以,可以通过手动把文件传输到HDFS上,然后进行加载;比如:hdfs dfs -mkdir /user/hive/warehouse/tb_partition/month=201802;创建目录后,把文件传输到目录下:hdfs dfs -put nameinfo.txt /usr/hive/warehousr/tb_partition/month=201802;毫无疑问,这里需要重新加载元数据,才能加载到传上去的文件。

创建多级分区:create table tb_mul_partition (id Int , name String) PARTITIONED BY(month String ,code String) row format delimited fields terminated by ';';这里,就创建了一张表,存在两个分区,按照month和code进行多级别的分区,而在读取数据的时候,也需要指明分区:load data local inpath '/home/files/nameinfo.txt' into table tb_mul_partition partition(month = '201802',code = '1000');这里,必须强调一下,如果指定了多个分区,在加载数据的时候,必须指定多个分区,否则会报错。

注:分区所使用的列,并不是正式数据中的一列,更像是伪列,所以需要指定分列的字段类型,在HDFS底层,就相当于按照分区创建了一个文件夹,将文件存在该目录下;这样,在我们指定查询数据的时候,可以从某一个文件夹内查询,大大提高了速度。

而分桶,则是依靠数据中真实存在的列,按照哈希取模的方式,将数据分成不同的文件进行存储,与分区相比,其粒度更细;假如说分为三个桶,那就是一份数据,会按照三份来进行存储。

JOIN操作

在传统数据库中,JOIN操作就是非常常见的一种操作,同样,Hive作为数据仓库,也支持JOIN操作,但是其只支持等值操作。

  1. Hive只支持等值连接,不支持所有非等值的连接
  2. Join操作中,每次MapReduce任务的逻辑如下,reducer会缓存除了最后一个表中的所有表的记录,再通过最后一个表将结果存储到文件系统;这就提示我们,最好是把小表放在前面,避免内存溢出,还能提高效率。
  3. 例句比如:SELECT a.* from visit_config a join visit_config_new b on (a.id = b.id);

从SQL到HQL

大同小异吧,基本的语法很相似,但是hive支持嵌入式的mapreduce程序,而且不支持Insert into,也不支持update,也不支持delete操作;这样就不需要复杂的锁机制,提高效率;而且同时也不支持事务机制,原理同上。

参考资料:

  1. https://www.cnblogs.com/HondaHsu/p/4346354.html
  2. https://www.cnblogs.com/one--way/p/7550795.html

这篇关于Hive全面深入理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141176

相关文章

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的