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如何通过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* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于