前言:
💞💞大家好,我是书生♡,本篇文章主要分享的是大数据开发中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实现复杂查询逻辑开发难度太大
- 使用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种客户端模式:
- CLI(command line interface)为shell命令行
- Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。(最常用的)
- 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只需要部署在一台服务器上就可以,也可部署在多台服务器上。
- 上传安装包 解压
先进入到指定的目录下,解压安装包
cd /export/server/
tar zxvf /export/server/apache-hive-3.1.2-bin.tar.gz
- 解决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/
- 配置环境变量
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
- 修改配置文件
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&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>
- 上传mysql jdbc驱动
驱动上传到/export/server/apache-hive-3.1.2-bin/lib/
目录下
mysql-connector-java-5.1.32.jar
- 初始化元数据
schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表
- 在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,并且需要使用账号进行登录
- 启动metastore服务
这个我们再上面已经启动过了 - 启动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 数仓的分层架构
数据应用的流程
- 源数据: 也就是需要被分析的数据,最开始在的地方,可能是业务数据库,日志文件,系统备份,或者是问卷调查等
- 数据仓库: 将多种数据源的数据集中存放在同一个数据平台中,方便后续进行数据处理
- 数据分析和可视化平台: 例如FineBI
数据仓库的分层
ODS层(operation data Store): 数据操作层,源数据层,主要就是将各个数据源中的数据集中采集到指定平台中,几乎不对数据做任何处理,只是临时存放等待后续处理
DW层(Data Warehouse) : 数据仓库层, 对于数据进行数据清洗,数据处理,数据转换等,使其满足数据分析的要求
DA层APP层(application) : 数据应用层, 根据业务部门的需求,进行数据分析处理,获得的数据可以直接用于前端展示或数据报表等.
为什么要进行数据分层呢?
- 如果数据分层,便于我们进行过程检查,方便协同开发.
- 方便过程数据的复用,缩短开发周期
- 如果出现数据错误,便于追根溯源.
分层好处
- 解耦合(相互依赖),方便协同开发
- 可以追根溯源,更快对于问题进行解决和修复
- 过程中创建的中间表可以重复利用
- 空间换时间 提高最终应用层使用数据的效率
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 外部表的使用场景
-
数据极其重要或不易获得,在使用过程中为了防止误删,必须使用外部表
-
数据集被多个表引用,或被多个用户引用,此时如果删除会影响其他人操作,我们就使用外部表
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;