Hive-基础入门
目录
第1章 Hive基本概念
第2章、安装步骤:
1、上传jar包至/usr/local/soft
2、解压并重命名
3、配置环境变量
4.配置HIVE文件
第3章 hive中数据库的操作
1、hive DDL 操作
2、Hive DML 操作
3、hive的本地模式
4、hive 表中数据加载方式
5、hive中的流量统计
6、hive数据导出
第4章 hive中的数据类型
1. 基本数据类型
2. 复杂数据类型
第5章 hive中的一个emp案例
1. 表结构设计
2. 数据加载
3. 常见SQL查询示例
第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;