【Hive上篇: 一篇文章带你使用Hive!深入了解Hive!学会Hive!】

前言:
💞💞大家好,我是书生♡,本篇文章主要分享的是大数据开发中hive的相关技术,什么是Hive?怎么使用Hive?怎么安装部署?Hive的sql语句!!!希望大家看完这篇文章会有所帮助。也希望大家能够多多关注博主。博主会持续更新更多的优质好文!!!
💞💞前路漫漫,希望大家坚持下去,不忘初心,成为一名神一样的程序员

个人主页⭐: 书生♡
gitee主页🙋‍♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬

目录

1. Apache Hive 概述

1.1 什么是Hive

  什么是Hive?

    Hive是基于Hadoop的一个数据仓库工具,用于进行数据提取、转换和加载(ETL)。它可以将结构化的数据文件映射为一张数据库表,并提供类似SQL的查询语言(HiveQL),使用户能够使用SQL语句来查询、汇总和整理大规模的数据集。Hive的核心功能包括数据存储、数据查询、数据处理、数据转换以及数据安全控制等。

在这里插入图片描述

 简单的定义就是:

Apache Hive是大数据数仓管理工具
Hive是一个SQL转化转化工具,将SQL的计算转为MapReduce的计算,让开发人员更加方便进行大数据开发

在这里插入图片描述

1.2 Hive和数仓最基础的功能

数仓的最基础的功能:

  • 存储数据
  • 数据的写入
  • 数据的读取
  • 数据的计算

Hive作为一个基于Hadoop的数据仓库工具,其核心功能包括数据存储、数据查询、数据操作、数据分区、扩展性和安全性等方面。

HIve最基础的功能:(了解)

  • 数据存储
    Hive是基于Hadoop的一个数据仓库工具,用于存储、查询和分析存储在Hadoop中的大规模数据。
    Hive可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能。
  • 数据查询
    Hive支持类SQL的查询语言(Hive SQL),允许用户通过类似SQL的语句来查询和分析存储在Hadoop中的数据。 支持包括SELECT、WHERE、DISTINCT、GROUP BY、ORDER BY等多种SQL查询功能。
    Hive的查询操作过程严格遵守Hadoop MapReduce的作业执行模型,将用户的Hive
    SQL语句转换为MapReduce作业提交到Hadoop集群上执行。
  • 数据操作
    Hive提供了包括数据更改(如LOAD、INSERT、IMPORT、EXPORT等)、移动(moving)、排序(sorting)、转换(transforming)等多种数据操作功能。
    允许用户从本地文件系统、HDFS、其他Hive表等导入数据,并支持将数据导出到本地文件系统、HDFS或其他系统(如MySQL)。
  • 数据分区
    Hive支持数据分区,允许用户手动指定将表中的数据按照一定维度切割成多个分区,以优化查询性能。 分区查询可以指定某个分区或者分区范围,提高查询效率。
  • 扩展性
    Hive提供了UDF(User-Defined Function)、UDAF(User-Defined Aggregate Function)和UDTF(User-Defined Table-Generating
    Function)等扩展机制,允许用户自定义函数以支持更复杂的数据分析。
    Hive还支持与其他Hadoop生态系统中的工具(如Pig、Spark等)进行集成,提供丰富的数据处理和分析能力。
  • 安全性
    Hive提供了用户管理和权限控制功能,可以通过授予或撤销用户的权限来限制其对Hive中数据的访问。 支持数据加密(如Transparent Data Encryption, TDE)以确保数据在存储和传输过程中的安全性。

1.3 元数据和行数据

什么是元数据?什么是行数据?

一张表的数据构成:元数据(以下这些都是元数据)

  • 表名
  • 字段名
  • 字段类型
  • 字段约束
  • 在哪个表中
  • 每个字段的含义
  • 这条记录的创建修改时间

表的行数据:表中每一行的数据

在这里插入图片描述

在mysql,oracle等数据库中,表的元数据和行数是数据库统一管理

在Hive中:

在hive中表的元数据和行数据由metastore和hdfs共同管理

  • 表的元数据由metastore管理存储
  • 行数据由hdfs管理存储

1.4 Hive的优点(了解)

1.使用Hadoop MapReduce直接处理数据所面临的问题

  • 人员学习成本太高 需要掌握java、Python等编程语言
  • MapReduce实现复杂查询逻辑开发难度太大
  1. 使用Hive处理数据的好处
  • 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
  • 底层执行MapReduce,可以完成分布式海量数据的SQL处理

1.5 注意

  • Hive不能存储数据(包括读写),其存储功能依托于HDFS

  • Hive也不能计算数据, 其计算功能依托于MapReduce+Yarn

  • Hive可以将结构化的数据映射为表

  • Hive可以将简单的SQL语句规划为结构逻辑复杂的MapReduce计算任务

2. Hive架构原理

Apache Hive其2大主要组件就是:SQL解析器以及元数据存储

在这里插入图片描述

2.1 用户接口

Hive为我们提供了3个接口,或者是说3种客户端模式:
在这里插入图片描述

  1. CLI(command line interface)为shell命令行
  2. Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。(最常用的)
  3. Hive Web interface是通过浏览器访问Hive。(一般不用)

Hive提供了 Hive Shell、 ThriftServer等服务进程向用户提供操作接口

2.2 HiveDriver hive驱动

Driver:包括解析器、计划编译器、优化器、执行器

在这里插入图片描述

  • 解析sql语句
  • 指定计划
  • 优化计划
  • 执行命令

这部分主要是依赖封装在Hive所依赖的Jar文件即Java代码

2.3 Metastore元数据存储

  • 元数据包含:用Hive创建的database、table、表的字段等元信息。
  • 元数据存储:存在关系型数据库中,如:hive内置的Derby数据库或者第三方MySQL数据库等。

在这里插入图片描述

Metastore:即元数据存储服务,作用是:客户端连接metastore服务,metastore再去连接MySQL等数据库来存取元数据。

有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL等数据库的用户名和密码,只需要连接metastore 服务即可。

2.4 执行计算任务

  • 向yarn申请资源
  • 从hdfs中提取数据

在这里插入图片描述

3. Hive的部署

3.1 HIve的三种安装模式

  • metastore服务配置有3种模式:内嵌模式、本地模式、远程模式

3.1.1 内嵌模式

优点:
解压hive安装包 bin/hive 启动即可使用

缺点:
不适用于生产环境,derby和Metastore服务都嵌入在主Hive Server进程中。一个服务只能被一个客户端连接(如果用两个客户端以上就非常浪费资源),且元数据不能共享
在这里插入图片描述

3.1.2 本地模式

优点:
1、元数据使用外置的RDBMS,常见使用最多的是MySQL。
2、不需要单独配置metastore 也不需要单独启动metastore服务
缺点:
如果使用多个客户端进行访问,就需要有多个Hiveserver服务,此时会启动多个Metastore有可能出现资源竞争现象

在这里插入图片描述

3.1.3 远程模式

优点:
可以单独使用外部库(mysql) 可以共享元数据 可以连接metastore服务也可以连接hiveserver2服务
metastore可以单独启动,配置 其他依赖hive的软件都可以通过Metastore访问hive

缺点:
需要注意的是如果想要启动hiveserver2服务需要先启动metastore服务

企业中也是最常用这种模式。
在这里插入图片描述

3.1.4 区分三种模式

区分3种配置方式的关键是弄清楚两个问题:
    Metastore服务是否需要单独配置、单独启动?
    Metadata是存储在内置库derby中,还是第三方库Mysql等中。

在这里插入图片描述

3.2 Hive的部署安装

hive只需要部署在一台服务器上就可以,也可部署在多台服务器上。

  1. 上传安装包 解压
    先进入到指定的目录下,解压安装包
cd /export/server/
tar zxvf /export/server/apache-hive-3.1.2-bin.tar.gz

在这里插入图片描述

  1. 解决Hive与Hadoop之间guava版本差异
    大家直接复制粘贴就可以这部分
rm -rf /export/server/apache-hive-3.1.2-bin/lib/guava-19.0.jar
cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar /export/server/apache-hive-3.1.2-bin/lib/
  1. 配置环境变量
echo 'export HIVE_HOME=/export/server/apache-hive-3.1.2-bin' >> /etc/profile
echo 'export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/sbin' >> /etc/profile
source /etc/profile
  1. 修改配置文件
    4.1 修改hive-env.sh
  • 修改文件名称
cd /export/server/apache-hive-3.1.2-bin/conf
mv hive-env.sh.template hive-env.sh

写入数据

echo 'export HIVE_CONF_DIR=/export/server/hive/conf' >> /export/server/hive/hive-env.sh
echo 'export HIVE_CONF_DIR=/export/server/hive/conf' >> /export/server/hive/hive-env.sh
echo 'export HIVE_AUX_JARS_PATH=/export/server/hive/lib' >> /export/server/hive/conf/hive-env.sh

4.2 修改hive-site.xml

  • 打开文件
vim hive-site.xml  # 配置元数据存储

复制粘贴如下内容

<configuration>
<!-- 存储元数据mysql相关配置 -->
<property>
	<name>javax.jdo.option.ConnectionURL</name>
	<value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&amp;useSSL=false</value>
</property>

<property>
	<name>javax.jdo.option.ConnectionDriverName</name>
	<value>com.mysql.jdbc.Driver</value>
</property>

<property>
	<name>javax.jdo.option.ConnectionUserName</name>
	<value>root</value>
</property>

<property>
	<name>javax.jdo.option.ConnectionPassword</name>
	<value>hadoop</value>
</property>

<!-- H2S运行绑定host -->
<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>node1</value>
</property>

<!-- 远程模式部署metastore metastore地址 -->
<property>
    <name>hive.metastore.uris</name>
    <value>thrift://node1:9083</value>
</property>

<!-- 关闭元数据存储授权  --> 
<property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
</property>
</configuration>
  1. 上传mysql jdbc驱动
    驱动上传到 /export/server/apache-hive-3.1.2-bin/lib/ 目录下
mysql-connector-java-5.1.32.jar
  1. 初始化元数据
schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表
  1. 在hdfs创建hive存储目录
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse

4. Hive的客户端

hive依赖于hadoop的功能才能正常使用,所以启动hive前必须先启动hadoop.

start-all.sh

在这里插入图片描述

检查mysql服务是否可以使用

systemctl status mysqld

在这里插入图片描述

4.1 本地模式使用

使用一代客户端在本地服务器上连接hive完成sql操作
需要先把metastore的元数据管理服务启动起来

启动metastore服务

hive --service metastore

在这里插入图片描述
但是这个样子我们就没有办法继续使用服务器了,所以我们一般让他在后台运行

nohup hive --service metastore &

在这里插入图片描述
使用一代客户端连接,不需要输入账号密码

直接输入:
hive

在这里插入图片描述

4.2 远程模式使用

可以在其他服务器中连接hive进行相关操作

可以使用二代客户端进行连接,二代客户端支持jdbc,并且需要使用账号进行登录

  1. 启动metastore服务
    这个我们再上面已经启动过了
  2. 启动hiveserver2服务
  • 底层调用thriftserver
  • 运行服务支持jdbc连接
nohup hive --service hiveserver2 &

在这里插入图片描述

hiveserver2的启动时间会比较长,可以通过端口查看确认hiveserver2是否真的启动
hiveserver2运行时会绑定10000端口

lsof  -i:10000

在这里插入图片描述
使用hive自带的二代客户端,通过jdbc方式连接hive

beeline

在这里插入图片描述

4.3 Datagrip使用(连接Hive)

前提: 启动metastore 和hiveserver2服务

Datagrip连接hive服务,本质上链接的是hiveserver2

  • 点击Datag Source 选择Apache Hive
    在这里插入图片描述
  • 填写相关服务器信息
    在这里插入图片描述
    第一次创建Hive,会要求下载驱动,有两种办法
    第一种:进入页面后会提示下载驱动,直接点击downLoad下载
    在这里插入图片描述
    第二种:就是将本地的驱动直接部署上来
    点击apache hive
    在这里插入图片描述
    在这里插入图片描述
    点击test connection验证连接,当连接成功时,点击ok就可以使用了
    在这里插入图片描述

4.4 注意

 Hive服务是单机服务,但是,可以进行分布式存储和分布式计算 (基于hdfs和MapReduce)
 Hhive部署完成后,只有node1可以启动服务,但是node2,node3…都可以使用hive服务,因为其可以使用客户端远程链接node1上的服务.

hdfs中namenode只在node1上有,此时node2,node3能否使用hadoop fs-指令操作hdfs?**

可以
访问逻辑:
  其实hdoop fs - 就是使用hdfs的客户端访问hdfs的服务端,而服务端在node1中,但是客户端每一台服务中都存在.所以我们可以在node2,node3中使用hadoop.

5. 数据仓库和ETL

5.1 数据库和数据仓库

  • 数据库:主要用于事务处理,即OLTP(On-Line Transaction Processing)【联机事务处理】
  • 数据仓库:主要用于数据分析,即OLAP(On-Line Analytical Processing)【联机分析处理】

OLTP : 联机事务处理, 就是保存我们日常生活中的各种用户行为产生的记录的数据平台.

  • 特点: 服务于业务,需要少量数据的频繁增删改查,要保证响应速度,保证数据安全,保证时效性.

OLAP : 联机分析处理 ,就是我们数据分析时所使用的海量数据存放的数据平台,一般会将多个业务数据库或各种数据源中的数据提取出来,统一存放在OLAP服务中.

  • 特点: 服务于分析,要能应对海量的数据存储和数据计算,对于响应速度要求不高,我们很少修改数据,所以也不需要对于数据的一致性,安全性等进行考虑.

5.1.1 数据库和数据仓库的区别

本质的区别就是OLTP 和OLAP系统的区别

  • 数据库更偏重于事务处理,要求其支持事务,增删改查效率较高
    • 事务: 最小业务单元, 在执行过程中,要么全部 成功,要么全部失败
    • 举例: 小椭圆给小绿转账1000元 , 银行系统需要给小椭圆减少1000元, 给小绿增加一千元 要么同时成功,要么同时失败
    • 落实到代码层面就是多条sql语句,要么全部成功,要么全部失败.
  • 数据仓库偏重于数据吞吐量和稳定,不要求支持事务,不要求较高的响应效率,但必须可以处理海量数据或文件

思考: 数据仓库是大型的数据库么? 不是
企业可以没有数据仓库,但是不能没有数据库

关系型数据库只要从事的是数据分析的工作,就可以看做是OLAP系统
但是Hive不可以作为OLTP使用因为其不具备事务功能.

5.1.2 数据仓库的核心特性

  • 面向主题性
  • 集成性
  • 不可更新性
  • 时变性

  面向主题性:主题(subject)是一个抽象的概念 数据综合体。一个分析的主题可以对应多个数据源。在数仓中开展分析,首先确定分析的主题,然后基于主题寻找、采集跟主题相关的数据。在数据分析中,要做到宁滥勿缺.
  集成性:数仓不是生成数据的平台 其数据来自于各个不同的数据源当我们确定主题之后 就需要把和主题相关的数据从各个数据源集成过来。因为同一个主题的数据可能来自不同的数据源 它们之间会存在着差异(异构数据):字段同名不统一、单位不统一、编码不统一; 因此在集成的过程中需要进行ETL(Extract抽取 Transform转换 load加载)
  不可更新性:数仓上面的数据几乎没有修改操作,都是分析的操作。数仓是分析数据规律的平台 不是创造数据规律的平台。 注意:改指的数据之间的规律不能修改。
  时变性:数仓是一个持续维护建设的东西。站在时间的角度,数仓的数据成批次变化更新。一天一分析(T+1) 一周一分析(T+7)

5.2 数仓的分层架构

数据应用的流程

  1. 源数据: 也就是需要被分析的数据,最开始在的地方,可能是业务数据库,日志文件,系统备份,或者是问卷调查等
  2. 数据仓库: 将多种数据源的数据集中存放在同一个数据平台中,方便后续进行数据处理
  3. 数据分析和可视化平台: 例如FineBI

数据仓库的分层

  • ODS层(operation data Store): 数据操作层,源数据层,主要就是将各个数据源中的数据集中采集到指定平台中,几乎不对数据做任何处理,只是临时存放等待后续处理

  • DW层(Data Warehouse) : 数据仓库层, 对于数据进行数据清洗,数据处理,数据转换等,使其满足数据分析的要求

  • DA层APP层(application) : 数据应用层, 根据业务部门的需求,进行数据分析处理,获得的数据可以直接用于前端展示或数据报表等.

为什么要进行数据分层呢?

  1. 如果数据分层,便于我们进行过程检查,方便协同开发.
  2. 方便过程数据的复用,缩短开发周期
  3. 如果出现数据错误,便于追根溯源.

分层好处

  • 解耦合(相互依赖),方便协同开发
  • 可以追根溯源,更快对于问题进行解决和修复
  • 过程中创建的中间表可以重复利用
  • 空间换时间 提高最终应用层使用数据的效率
    在这里插入图片描述

5.3 ETL和ELT

E: extract 数据抽取,将数据从不同的数据源 中抽取出来

T: transform 数据转换, 将数据通过清洗,处理,转换为满足数据分析要求的数据

L:load 数据加载,将数据加载的数据仓库中

  • ETL: 传统数仓的处理模式, 将数据抽取出来存放到临时数据库,进行转换后加载到数据仓库

  • ELT: 现在大多数数仓的处理模式. 将数据抽取后直接加载到数据仓库中,在数仓内部进行反复处理(分层处理)

思考:什么时候使用ETL 什么时候使用ELT呢?

如果数据处理逻辑十分简单,且数据量不太大,则使用ETL即可

如果数据量极大或数据处理逻辑十分复杂,则我们使用ELT进行处理.

6. Hive的数据库操作

6.1 Hive数据库操作

6.1.1 数据库的创建

hive中不需要指定数据库的编码格式, 因为数据文件的编码格式是hdfs决定的.

语法:
CREATE DATABASE [IF NOT EXISTS] database_name
-- 指定数据库在hdfs上路径位置
[LOCATION hdfs_path]

[] 括起来内容是可选的关键字语法

Hive sql中创建数据库可以指定路径

  • 按照默认的路径创建数据库
-- 在hive中不需要指定charset
create database itcast;
-- 一但创建成功会在hdfs的默认路径下出现一个数据库目录 在hdfs的/user/hive/warehousw
create database if not exists itcast;

在这里插入图片描述

  • 指定hdfs的路径目录作为数据库目录
-- 指定数据库在hdfs上的路径目录
-- 1-现在hdfs上创建一个空的数据库目录
-- 2-指定该空目录作为hive数据库的数据目录
create database itheima
location '/itheima';

在这里插入图片描述
创建数据库的时候添加注释

--  给数据库添加注释信息
create database test03 comment 'this is a bigdata database';

6.1.2 切换数据库

-- use 切换数据库
use itcast;
use itheima;

6.1.3 删除数据库

-- 删除数据库  将 hdfs上的数据库目录一并删除
drop database itcast;
drop database itheima;
-- 如果数据库已经存在表数据,则需要强制删除  在有数据的情况下不要删库
drop database itcast cascade ;

6.1.4 查看数据库信息/建库语句

-- 查看数据库信息
desc database itheima;

-- 查看建库语句
show create database itcast;

-- 查询当前正在使用的数据库
select current_database();

6.1.5 schema 替换

在hive中 database 完全等价与 schema 可以任意替换
上述所有操作, 将database 切换为schema都可以正常使用

create schema test_db1;

desc schema test_db1;

6.2. Hive的数据表操作

6.2.1 建表语法

语法:

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: 
  [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

基本语法:

create table  [库名].表名(
	字段 字段类型 
)

6.2.2 表的创建

创建表默认是内部表。

-- 表的基本创建
-- 表创建成功后会在对应数据库目录下创建一个表目录
create table itcast.tb_stu(
    id int,
    -- 在hive中字符类型使用string
    name string,
    gender string,
    age int,
    create_time date,
    -- decimal 类型表示小数  10 整数部分的个数+小数据部分的个数   2 表示小数位数
    height decimal(10,2)
);

create table itheima.tb_goods(
    id int,
    name string,
    price decimal(10,2),
    create_time date
);

6.2.3 其他创建表方式(as 和 like)

语法:

  • create table … as … 将查询出来的数据内容,创建一个表,保存起来,复制表的时候,分割附没有复制过来,还是默认的
  • create table … like … 复制一个表的表结构并创建新表
使用as复制表的内容:

create table student03 as
select *
from student02;
-- 只复制需要的字段内容
-- create table student03 as
-- select name
-- from student02;
-- 查询表结构
desc student03;
使用as,只复制表的结构,不复制表的内容:

create table student04 like student02;

-- 查询表结构(包括表的参数都复制了一份)
desc student04;
-- 查看表中的数据内容 (只复制表结构,不复制表的数据)
select *
from student04;

6.2.4写入数据

-- 表数据写入
-- 数据是文件的方式存储在对应的表目录下
insert into itcast.tb_stu values
(1,'张三','男',20,'2023-10-10',178.23),
(2,'李四','男',21,'2023-10-11',175.23);

-- 查看表数据
select * from itcast.tb_stu;

6.3 内部表和外部表

6.3.1概念

内部表:未被external修饰的是内部表(managed table)
外部表:被external修饰的为外部表(external table)

内部表创建:默认就是内部表
create table student01
(
    id     int comment 'stu_id',
    name   string comment 'stu_name',
    gender string comment 'stu_gender'
) comment 'stu_table';

在这里插入图片描述

创建外部表:需要指定关键字external在这里插入图片描述

create external table student06
(
    id   int,
    name string,
    age  string
) row format delimited fields terminated by '\t';

在这里插入图片描述

create external table 表名(
	字段 字段类型
)

案例:

-- 创建内部表
create table tb_managed(
    id int,
    name string
);
-- 创建外部表
create external table tb_external(
    id int,
    name string
);

desc formatted tb_managed;
desc formatted tb_external;

drop table tb_managed;
drop table tb_external;

在这里插入图片描述

6.3.2 内部表和外部表相互转换

修改表的类型,将内部表设置为外部表,或者将外部表设置为内部表
我们使用
tblproperties(‘EXTERNAL’=‘FALSE’); false为内部表
tblproperties(‘EXTERNAL’=‘TRUE’);true为外部表;

-- 修改表的类型
desc formatted tb_managed;
alter table tb_managed set tblproperties('EXTERNAL'='TRUE'); -- 设置为外部表
alter table tb_managed set tblproperties('EXTERNAL'='FALSE');-- 设置为内部表

在这里插入图片描述

6.3.3区别

创建表:

  • Hive创建内部表时,会将数据移动到数据仓库指向的路径,hive管理数据的生命周期;
  • Hive创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。

删除表:

  • Hive删除内部表时,内部表的元数据和数据会一起被删除,同时对于一些hive操作不适应于外部表,比如单个查询语句创建表并向表中插入数据。

  • Hive删除外部表时,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。创建外部表时,甚至不需要知道外部数据是否存在,可以把创建数据推迟到创建表之后才进行。

6.3.4 外部表的使用场景

  1. 数据极其重要或不易获得,在使用过程中为了防止误删,必须使用外部表

  2. 数据集被多个表引用,或被多个用户引用,此时如果删除会影响其他人操作,我们就使用外部表

6.4hive基础语法

6.4.1数据字段类型

数据类型官网:数据类型🤞🤞🤞
在这里插入图片描述

数值型:

  • 整数
    tinyint
    smallint
    int
    bigint
  • 小数
    float
    double
    decimal()精确到小数点后几位
  • 日期类型
    data 日期
    timestamps 日期时间
  • 字符串类型
    string
    varchar
    char
  • 布尔类型
    用1和0表示真假
  • 复杂类型
    array【】数组类型
    【1,2,3】,【‘a’,‘b’,‘c’】
  • map类型
    {key:value}

hive数据类型案例:

-- hive中的数据类型演示
use itcast;
-- 创建表
create table tb_test(
    id tinyint comment 'id值',
    age smallint comment '年龄',
    phone int comment '手机号',
    name varchar(20),
    gender string,
    weight decimal(10,2),
    create_time timestamp,
    hobby array<string> comment '兴趣爱好', -- [数据1]  arrary<数组中的数据类型>
    hero map<string,int> comment '游戏英雄' -- {key:value}  指定key值类型,指定value值类型
)comment '数据类型测试表';

-- 写入数据进行类型测试
insert into tb_test values(1,20,13711111111,'张三','男',180.21,'2020-10-01 10:10:10',array('篮球','足球'),map('关羽',80,'小乔',60));
insert into tb_test values(2000,20,13711111111,'张三','男',1800.21,'2020-10-01 10:10:10',array('篮球','足球'),map('关羽',80,'小乔',60));

select * from tb_test;
select hobby[1] from tb_test;
select hero['关羽'] from tb_test;

6.4.2 分隔符指定

对hdfs上的文件数据存储时的分割符进行指定
hive在将行数据存储在hdfs上时,默认字段之间的数据分隔符 \001
在开发中,我们一般会使用ascii中的符号进行分隔符指定,因为特殊字符占用空间较大,常用的分隔符 \t , : \001

在这里插入图片描述

在创建表时可以指定分割符

row format delimited fields terminated by '分割符'
案例:
create table tb_row_field
(
    id     int,
    name   string,
    age    int,
    gender string
) row format delimited fields terminated by ','; -- 指定分隔符 固定格式

我们制定分隔符为‘,’,文件就可以以我们制定个字符分割
在这里插入图片描述

6.5 表的属性修改

名字修改,字段名修改,字段类型修改
使用:
alter 关键字

6.5.1 表的属性修改

alter table 表名  rename to 新的表名
alter table 表名  add columns(字段名 字段类型)
alter table 表名  change  旧字段名  新字段 字段类型
alter table 表名  set  属性设置

-- 表的修改修改操作
create table tb_ddl(
    id int,
    name string,
    age int,
    gender string
);

desc formatted tb_ddl2;

-- 修改表名
alter table tb_ddl rename to tb_ddl2;

-- 增加字段
alter table tb_ddl2 add columns(phone string);


-- 修改字段
alter table tb_ddl2 change id id bigint;
desc tb_ddl2;
-- 修改字段类型是,只能将小字节的类型修改为大字节的类型
-- alter table tb_ddl2 change id id int;



-- 修改表属性
alter table tb_ddl2 set tblproperties('age12'='20');
desc formatted tb_ddl2;

-- hdfs://node1:8020/user/hive/warehouse/itcast.db/tb_ddl2
alter table tb_ddl2 set location 'hdfs://node1:8020/tb_ddl2';
desc formatted tb_ddl2;
insert into tb_ddl2 values(1,'aa',20,'ccc','123123123');


alter table tb_ddl2 add columns(create_time date comment '创建时间',price decimal(10,2));
desc tb_ddl2;
alter table tb_ddl2 change age age1 string after phone;
desc tb_ddl2;
alter table tb_ddl2 change age1 age double after id;
desc tb_ddl2;

6.5.2 表的删除,清空数据

在hive中我们想要删除表包括目录的元数据,使用 drop 、只想清空数据使用truncate

-- 表删除  会删除表的目录和表的元数据信息
drop table tb_ddl2;
select * from tb_ddl2;
-- 表清空数据  把存储数据的文件一并删除
select * from tb_row_field;
truncate table tb_row_field;

注意重点:

  • 不能清空外部表,可以删除
  • 可以清空内部表,可以删除

7 . 数据加载到表中

在对表数据写入时有两张方式

  • 方式一 直接将数据文件上传到指定的表目录下(加载文件)
  • 方式二 通过insert将数据写入的表目录的文件中(sql语句)

7.1 将数据文件上传到对应的表目录下(加载文件)

在node1的/root目录下,创建一个hive_data目录,将准备好的数据资料中所有txt文件上传至该目录下.

创建一个表:

CREATE TABLE test_load
(
    dt      string comment '时间(时分秒)',
    user_id string comment '用户ID',
    word    string comment '搜索词',
    url     string comment '用户访问网址'
) comment '搜索引擎日志表' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

7.1.1 使用hdfs页面进行上传

在这里插入图片描述

7.1.2 手动上传加载数据

使用终端指令,将数据文件上传到hive的表目录下

hdfs dfs -put./search_log.txt / user / hive /warehouse/test01.db/test_load

-- 查看表中的数据内容
select * from test_load;

7.1.3 本地服务器文件上传加载

语法:
LOAD DATA LOCAL INPATH '路径'  INTO TABLE 表名 
-- 第一步: 数据准备, 创建表test_load02 表结构和test_load一致(like)
create table test_load02 like test_load;
desc test_load02;
select * from test_load02;
-- 第二步: 将search_log.txt文件放置在node1的/root/hive_data目录中
-- 第三步: 使用sql语句,将数据文件search_log.txt 上传到表test_load1中
-- 格式: load data local inpath 'node1上的文件路径' into table 目标表名;
load data local inpath '/root/hive_data/search_log.txt' into table test_load02;
-- 第四步: 查看文件是否上传成功
-- 第五步: 查看表中的数据内容
select *
from test_load02;
-- 有数据,且数据映射成功

在这里插入图片描述

7.1.4 hdfs文件上传加载

语法:

load data inpath ‘hdfs路径’ into table 指定表 (数据文件做移动操作)

-- 第一步: 数据准备, 创建表test_load03 表结构和test_load一致(like)
create table test_load03 like test_load;
-- 第二步: 将search_log.txt文件放置在hdfs的/tmp目录中
-- 第三步: 使用sql语句,将数据文件search_log.txt 加载到test_load03中
-- 格式: load data inpath 'hdfs上的文件路径' into table 目标表名;
load data inpath '/tmp/search_log.txt' into table test_load03;
-- 第四步: 查看文件是否上传成功
-- 第五步: 查看表中的数据内容
select *
from test_load03;

在这里插入图片描述

7.1.4 hdfs文件上传和本地上传的文件区别

  • 从hdfs中加载数据到表中时,数据文件做移动操作
  • 从node1本地加载数据到表中时,数据文件做复制操作

7.1.5 文件覆盖加载

语法:

load data [local] ‘路径’ overwrite into table 目标表

-- 第一步: 数据准备, 创建表test_load04 表结构和test_load一致(like)
create table test_load04 like test_load;
-- 第二步: 在node1上创建一个空文件search_log_01.txt
-- 第三步: 将数据文件 search_log_01.txt 加载到目标表中
-- 格式: load data local inpath '数据文件路径' into table 目标表名;
load data local inpath '/root/hive_data/search_log_01.txt' into table test_load04;
-- 第三步: 查看文件是否上传成功
-- 第四步: 查看表中的数据内容
select *
from test_load04;
-- 第五步: 使用覆盖加载的方式上传 search_log.txt
-- 格式: load data [local] inpath '数据文件路径' overwrite into table 目标表名;
load data local inpath '/root/hive_data/search_log.txt' overwrite into table test_load04;
-- 第六步: 查看表中的数据看是否覆盖成功
select *
from test_load04;

在这里插入图片描述

7 .2 数据加载到表中(sql方式)

我们正常使用insert into tb_order values()()插入数据,这种插入方式,不推荐,因为大数据场景下这样插入数据效率极低.开发中很少用

7.2.1 insert into 表名 select …;

-- 第一步: 数据准备, 创建表test_load05 表结构和test_load一致(like)
create table test_load05 like test_load;
-- 第二步: 查询test_load表中数据, 将数据插入到test_load5中
insert into test_load05
select *
from test_load;
-- 第三步: 查看表中的数据内容
select *
from test_load05;

在这里插入图片描述

7.2.2 insert overwrite table 表名 select …;

-- 第一步: 数据准备, 创建表test_load06 表结构和test_load一致(like)
create table test_load06 like test_load;
-- 第二步: 查询test_load表, 将数据覆盖插入到test_load6
select *
from test_load06;
insert into test_load06
select *
from test_load;
-- 第三步: 插入后查看数据是否存在
select *
from test_load06;
-- 第四步: 再次查询test_load06中的数据插入会后, 查看原有数据是否被覆盖
insert overwrite table test_load06
select *
from test_load
limit 3;
-- 第五步: 查看数据是否已经覆盖
select *
from test_load06;
-- insert overwrite后,表中的原有数据被清空.仅保留本次插入的数据内容

在这里插入图片描述

7.3 数据导出到目录

7.3.1 本地数据导出到目录

语法:

insert overwrite local directory '本地路径' select ...;
-- 第一步: 将test_load中的数据查询出来,导出到node1的 /root/test/aaa目录下 (aaa文件夹可有可无)
insert overwrite local directory '/root/test/aaa'
select *
from test_load;
-- 尝试 获取表中的一部分数据导出到node1中 只获取 user_id, url
insert overwrite local directory '/root/test/aaa'
select user_id, url
from test_load;
-- 第二步: 经过观察,我们发现导出到node1中的文件会覆盖该目录中所有的文件内容,并且数据文件字段间的分隔符默认为\001
-- 在导出数据的同时,指定分隔符为\t
-- insert overwrite local directory '/root/test/aaa'
--     row format delimited fields terminated by '\t'
-- select * from test_load;
insert overwrite local directory '/root/test/aaa' row format delimited fields terminated by '\t'
select *
from test_load;

在这里插入图片描述

7.3.2 hdfs数据导出到目录

语法:

insert overwrite directory ‘hdfs路径’ select …;
将查询到的数据导出到hdfs文件系统中

-- 第一步: 将test_load中的数据查询出来,导出到hdfs的 /tmp/test目录下 (最好先创建)
insert overwrite directory '/aaa'
select *
from test_load;
-- 第二步: 查看hdfs中的文件内容,发现数据已经成功导出, 默认分隔符为/001, 文件内其他数据以被清空
-- 注意: 使用insert overwrite directory 进行数据导出,一定要注意谨慎操作,因为会将该目录中原有的数据全部清空,且无法恢复.
insert overwrite directory '/aaa' row format delimited fields terminated by '\t'
select user_id, url
from test_load;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值