目录
第1章 Hive基本概念
1.1什么是hive
1)hive简介
- Hive:由Facebook开源用于解决海量结构化日志的数据统计工具
- Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类sQL查询功
- 可以将数据加载到表中,编写SQL进行分析
- 底层依赖Hadoop,所以每一次都要启动Hadoop(hdfs以及yarn)
- 可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容,这套SQL简称Hive SQL
- hive底层计算框架可以使用MapReduce,也可以使用Spark\Tez
- hive不是数据库,而是一个将MapReduce包了一层壳儿,类似于中介。
2)体系架构
第2章、安装步骤:
1、上传jar包至/usr/local/soft
将hive-3.1.2上传到虚拟机中的/usr/local/soft目录下
2、解压并重命名
tar -zxvf apache-hive-3.1.2-bin.tar.gz
# 重命名
mv apache-hive-3.1.2-bin hive-3.1.2/
3、配置环境变量
vim /etc/profile
#增加以下内容:
# HIVE_HOME
export HIVE_HOME=/usr/local/soft/hive-3.1.2/
export PATH=$PATH:$HIVE_HOME/bin
#保存退出 source 使其生效
source /etc/profile
4.配置HIVE文件
1、配置hive-env.sh
cd $HIVE_HOME/conf
# 复制命令
cp hive-env.sh.template hive-env.sh# 编辑
vim hive-env.sh# 增加如下内容
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/usr/local/soft/hadoop-2.7.6# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/usr/local/soft/hive-3.1.2/conf
2、配置hive-site.xml
上传hive-site.xml到conf目录:
hive-site.xml文件内容:
<configuration>
<property>
<!-- 查询数据时 显示出列的名字 -->
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<!-- 在命令行中显示当前所使用的数据库 -->
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<!-- 默认数据仓库存储的位置,该位置为HDFS上的路径 -->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 8.x -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT</value>
</property>
<!-- 8.x -->
<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>123456</value>
</property>
<!-- hiveserver2服务的端口号以及绑定的主机名 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>master</value>
</property>
</configuration>
3、配置日志
# 创建日志目录
cd $HIVE_HOME
mkdir log# 设置日志配置
cd confcp hive-log4j2.properties.template hive-log4j2.properties
vim hive-log4j2.properties
# 修改以下内容:
property.hive.log.dir = /usr/local/soft/hive-3.1.2/log
4、修改默认配置文件
cp hive-default.xml.template hive-default.xml
5、上传MySQL连接jar包
上传 mysql-connector-java-5.1.37.jar 至 /usr/local/soft/hive/lib目录中
6、修改MySQL编码
修改mysql编码为UTF-8:
1、 编辑配置文件
vim /etc/my.cnf
2、加入以下内容:
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
3、 重启mysql
systemctl restart mysqld
7、初始化HIVE
schematool -dbType mysql -initSchema
8、进入hive
hive
第3章 hive中数据库的操作
1、hive DDL 操作
Hive DDL用于定义Hive 数据库模式,其命令包括create、drop、alter、truncate、show
和describe等,主要是对数据库和表进行创建、修改、删除等操作。
(1)创建数据库
【语法】
CREATE (DATABASESCHEMA) [IF NOT EXISTS] database _name
[COMMENT database_comment]
[LOCATION hdfs_path][WITH DBPROPERTIES
示例:
创建empdb数据库。
关键代码:
hive>create database empdb;
> show databases;
> use empdb;
其中,“show databases;”显示数据库列表,“useempdb;”选择empdb作为当前操作
的数据库。
(2)修改数据库
1. 修改数据库描述:
ALTER DATABASE database_name SET DBPROPERTIES ('description'='新的描述内容');
2. 修改数据库位置
ALTER DATABASE database_name SET LOCATION '新的存储路径';
2、Hive DML 操作
1. 插入数据(INSERT)
1.1 插入查询结果到表
INSERT INTO TABLE sales_summary
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id;
1.2 插入数据到分区表
INSERT INTO TABLE sales_data PARTITION (year)
SELECT product_id, amount, year
FROM raw_sales
WHERE year = 2024;
1.3 从文件加载数据
LOAD DATA LOCAL INPATH '/local/path/data.csv' INTO TABLE sales;
2. 更新数据(UPDATE)
UPDATE table_name
SET column1 = value1, column2 = value2
WHERE condition;
3. 删除数据(DELETE)
DELETE FROM orders
WHERE order_date < '2024-01-01';
3、hive的本地模式
1. 本地模式的特点
运行环境:查询在单个节点上运行,不依赖于Hadoop的分布式计算框架(如MapReduce或Tez)。
数据存储:数据存储在本地文件系统中,而不是HDFS。
适用场景:适用于处理小规模数据集,或者在开发环境中快速测试查询逻辑。
性能限制:由于不使用分布式计算资源,本地模式的性能通常低于集群模式,不适合处理大规模数据。
2. 启用本地模式
要启用Hive的本地模式,需要设置hive.exec.mode.local.auto
参数为true
。此外,还可以通过设置其他参数来控制本地模式的行为。
2.1 自动本地模式
Hive可以自动根据查询的复杂性和数据量决定是否使用本地模式。启用自动本地模式的命令如下:
SET hive.exec.mode.local.auto = true;
默认情况下,当查询满足以下条件时,Hive会自动选择本地模式:
输入文件的总大小小于
hive.exec.mode.local.auto.inputbytes.max
(默认值为128MB)。输入文件的总数小于
hive.exec.mode.local.auto.inputfiles.max
(默认值为4)。
2.2 强制本地模式
如果需要强制某个查询始终运行在本地模式,可以在查询中显式指定:
SET hive.exec.mode.local.auto = true;
SET hive.exec.mode.local.auto.inputbytes.max = -1; -- 无限制
SET hive.exec.mode.local.auto.inputfiles.max = -1; -- 无限制
然后执行:
SELECT * FROM small_table WHERE id < 10;
3.hive的打印当前数据库
在Hive中,如果你想查看当前使用的数据库,可以使用以下命令:
SQL:
SELECT CURRENT_DATABASE();
hive命令行:
hive> show current database;
4、hive 表中数据加载方式
在Hive中,数据加载是将外部数据导入到Hive表中的过程。
1. 使用LOAD DATA
命令
LOAD DATA
是Hive中最常用的数据加载方式,支持从本地文件系统或HDFS加载数据到Hive表中。
1.1 从本地文件系统加载数据
LOAD DATA LOCAL INPATH '/home/user/data.csv' INTO TABLE my_table;
LOCAL INPATH
表示数据文件存储在本地文件系统中。
1.2 从HDFS加载数据
LOAD DATA INPATH 'hdfs://namenode:8020/user/hive/data/file.txt' INTO TABLE my_table;
INPATH
表示数据文件存储在HDFS中。
1.3使用INSERT INTO
语句
INSERT INTO
语句可以将查询结果插入到目标表中
INSERT INTO TABLE sales_summary
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id;
5、hive中的流量统计
在Hive中进行流量统计通常涉及以下几个步骤:数据准备、表的创建、数据加载以及编写统计查询。
1. 数据准备
确保流量数据已经存储在HDFS或其他支持的存储系统中。
2. 创建Hive表
创建一个Hive表用于存储流量数据。可以使用以下HiveQL命令:
CREATE TABLE IF NOT EXISTS traffic_data (
timestamp STRING,
traffic INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
3. 加载数据
将数据加载到Hive表中。假设数据存储在HDFS路径/user/hive/data/traffic.txt
中,可以使用以下命令:
LOAD DATA INPATH '/user/hive/data/traffic.txt' INTO TABLE traffic_data;
4. 编写统计查询
根据需求编写Hive查询语句。例如,统计流量波动率(标准差与平均值的比值):
WITH traffic_stats AS (
SELECT
AVG(traffic) AS avg_traffic,
STDDEV(traffic) AS stddev_traffic
FROM
traffic_data
)
SELECT
stddev_traffic / avg_traffic AS volatility_ratio
FROM
traffic_stats;
AVG(traffic)
计算流量的平均值。STDDEV(traffic)
计算流量的标准差。volatility_ratio
为流量波动率。
6、hive数据导出
1. 使用Hive的INSERT OVERWRITE
命令导出数据
Hive提供了INSERT OVERWRITE
命令,可以将查询结果导出到本地文件系统或HDFS。
1.1导出到本地文件系统:
INSERT OVERWRITE LOCAL DIRECTORY '/path/to/local/directory'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
SELECT * FROM your_table;
1.2导出到HDFS:
INSERT OVERWRITE DIRECTORY '/path/to/hdfs/directory'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
SELECT * FROM your_table;
2. 使用Hive的EXPORT TABLE
命令
EXPORT TABLE
命令可以将整个表的数据和元数据导出到指定目录:
EXPORT TABLE your_table TO '/path/to/export/directory';
第4章 hive中的数据类型
在Hive中,数据类型分为基本数据类型和复杂数据类型。
1. 基本数据类型
基本数据类型用于存储简单的值,如整数、浮点数、字符串等。
1.1数值类型:
1.2 字符串类型
数据类型 | 描述 |
---|---|
STRING |
可变长度的字符数据,最大长度为 2GB |
VARCHAR(n) |
可变长度的字符数据,最大长度为 65535 字符 |
CHAR(n) |
固定长度的字符数据,最大长度为 255 字符 |
1.3 日期和时间类型
数据类型 | 描述 | 格式 |
---|---|---|
DATE |
日期类型,只包含年月日 | YYYY-MM-DD |
TIMESTAMP |
日期和时间,精确到纳秒 | YYYY-MM-DD HH:MM:SS[.nnnnnnnnn] |
INTERVAL |
时间间隔类型,用于表示时间段 | 例如:INTERVAL '1' YEAR |
1.4 布尔类型
数据类型 | 描述 |
---|---|
BOOLEAN |
布尔值,只能取 TRUE 或 FALSE |
2. 复杂数据类型
复杂数据类型用于存储结构化的数据,如数组、映射和结构体。
2.1 数组(ARRAY)
数组是一个有序的元素集合,所有元素必须是同一类型。
ARRAY<INT> -- 例如:[1, 2, 3]
2.2 映射(MAP)
映射是一个键值对的集合,键和值可以是不同类型。
MAP<STRING, INT> -- 例如:{"apple": 1, "banana": 2}
2.3 结构体(STRUCT)
结构体是一个字段的集合,每个字段可以有不同的类型。
STRUCT<id:INT, name:STRING, age:INT> -- 例如:(1, "Alice", 25)
3. 数据类型转换
Hive支持显式和隐式的数据类型转换。例如:
SELECT CAST(column_name AS STRING) FROM table_name;
第5章 hive中的一个emp案例
以下是一个基于Hive的emp
表案例,包括表结构设计、数据加载以及一些常见的SQL查询示例。
1. 表结构设计
(1) dept
表
dept
表存储部门信息,包含部门编号、部门名称和部门所在地:
CREATE TABLE dept (
deptno INT,
dname STRING,
loc STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
(2) emp
表
emp
表存储员工信息,包含员工编号、姓名、职位、领导编号、入职日期、工资、奖金和部门编号:
CREATE TABLE emp (
empno INT,
ename STRING,
job STRING,
mgr INT,
hiredate STRING,
sal DECIMAL(10, 2),
comm DECIMAL(10, 2),
deptno INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
2. 数据加载
假设数据文件已经准备好,存储在本地或HDFS中,可以使用以下命令加载数据:
2.1加载dept
表数据
LOAD DATA LOCAL INPATH '/path/to/dept_data.csv' INTO TABLE dept;
2.2加载emp
表数据
LOAD DATA LOCAL INPATH '/path/to/emp_data.csv' INTO TABLE emp;
3. 常见SQL查询示例
(1) 查询总员工数
SELECT COUNT(DISTINCT empno) AS total_employees FROM emp;
(2) 查询总共有多少个职位
SELECT COUNT(DISTINCT job) AS total_jobs FROM emp;
(3) 统计每个职位的员工数量,并按数量降序排列
SELECT job, COUNT(empno) AS count_emp
FROM emp
GROUP BY job
ORDER BY count_emp DESC;
(4) 查询入职最早的员工
SELECT ename, hiredate
FROM emp
ORDER BY hiredate ASC
LIMIT 1;
(5) 统计每个职位的最高工资和平均工资
SELECT job, MAX(sal) AS max_salary, AVG(sal) AS avg_salary
FROM emp
GROUP BY job;
(6) 查询每个地区工资最高的员工
SELECT e.ename, e.sal, d.loc
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE (d.loc, e.sal) IN (
SELECT loc, MAX(sal)
FROM emp e2
JOIN dept d2 ON e2.deptno = d2.deptno
GROUP BY loc
);
(7) 查询上半年入职员工最多的地区
WITH hire_data AS (
SELECT e.ename, e.hiredate, d.loc,
CASE WHEN MONTH(e.hiredate) <= 6 THEN 'first_half_year' ELSE 'last_half_year' END AS hire_year
FROM emp e
JOIN dept d ON e.deptno = d.deptno
)
SELECT loc, COUNT(ename) AS count
FROM hire_data
WHERE hire_year = 'first_half_year'
GROUP BY loc
ORDER BY count DESC
LIMIT 1;