Hive SQL 实战:电商销售数据分析全流程案例
如果要问当下是哪个行业最热门,其实大多数人应该会想到电商,毕竟大多数人可能每天都会花点时间在各种短视频等平台,其中会充斥着很多商品,这就是我们的电商(如果我的说辞有不对的大家可以指正)。
那么在电商行业中,每日都会产生海量的销售数据,如何从这些数据中挖掘出有价值的信息,成为企业提升竞争力的关键。Hive SQL 凭借其强大的大数据处理能力,能够高效地完成电商销售数据的分析工作。接下来,我们将通过一个完整的电商销售数据分析案例,深入了解 Hive SQL 的实际应用。
一、案例背景与数据准备
假设我们是一家电商企业,拥有多维度的销售数据,包括订单信息、用户信息、商品信息等。为了简化案例,我们主要聚焦于以下三个核心数据表:
- 订单表(orders):记录每一笔订单的详细信息,包括订单编号、用户编号、订单日期、订单金额、订单状态等。
- 用户表(users):存储用户的基本信息,如用户编号、用户姓名、用户年龄、用户性别、用户所在地区等。
- 商品表(products):包含商品的相关信息,例如商品编号、商品名称、商品类别、商品价格等。
我们提前准备好模拟数据,以 CSV 文件的形式存储在本地。以下是部分示例数据(实际数据量会更大):
订单表(orders.csv)
order_id | user_id | order_date | order_amount | order_status |
1001 | 101 | 2025-06-01 | 199.00 | 已完成 |
1002 | 102 | 2025-06-02 | 299.00 | 已完成 |
1003 | 101 | 2025-06-03 | 99.00 | 已取消 |
1004 | 103 | 2025-06-04 | 399.00 | 已完成 |
用户表(users.csv)
user_id | user_name | user_age | user_gender | user_region |
101 | 张三 | 28 | 男 | 华北 |
102 | 李四 | 32 | 女 | 华东 |
103 | 王五 | 25 | 男 | 华南 |
商品表(products.csv)
product_id | product_name | product_category | product_price |
2001 | 智能手机 | 电子产品 | 4999.00 |
2002 | 纯棉 T 恤 | 服装 | 99.00 |
2003 | 蓝牙耳机 | 电子产品 | 299.00 |
二、Hive 表的创建
在 Hive 中创建与上述数据对应的表,我们先创建数据库用于存放这些表:
CREATE DATABASE IF NOT EXISTS e_commerce;
USE e_commerce;
-
CREATE DATABASE
这是 SQL 中用于创建新数据库的关键字组合。 -
IF NOT EXISTS
(可选)
这是一个保护机制,表示如果数据库已经存在,则不再重复创建,避免报错。 -
e_commerce
是你要创建的数据库名称。你可以根据项目需求更改这个名称,比如my_store
,logistics_db
等。 -
;
表示 SQL 语句结束。
✅ 示例扩展:
如果我们这里不加 IF NOT EXISTS
,那么当数据库已存在时(数据库名称重复)会报错。
🔍 拆分解析:(第二行)
-
USE
是 MySQL 中用来选择数据库的关键字。 -
e_commerce
是要切换到的目标数据库名称。 -
;
结束符。
⚠️ 注意事项:
- 如果你没有先创建数据库就执行
USE e_commerce;
,MySQL 会提示错误:
ERROR 1049 (42000): Unknown database 'e_commerce'
- 所以必须确保在
USE
之前已经用CREATE DATABASE
创建了数据库。
1. 创建订单表(orders)
CREATE TABLE orders (order_id INT,user_id INT,order_date DATE,order_amount DECIMAL(10, 2),order_status VARCHAR(20)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
🔍 功能说明:
这部分是标准的建表语句,定义了表名 orders
和它的字段结构。
CREATE TABLE orders
: 创建一个名为orders
的表。- 表中包含以下字段:
order_id INT
: 订单ID,整型user_id INT
: 用户ID,整型order_date DATE
: 下单日期,日期类型order_amount DECIMAL(10, 2)
: 订单金额,最多10位数,保留两位小数order_status VARCHAR(20)
: 订单状态,最大长度为20的字符串
⚠️ 注意:Hive 中没有
VARCHAR
类型,实际使用的是STRING
,但某些 Hive 版本兼容VARCHAR(n)
并将其转换为STRING
。建议统一使用STRING
。
🔍 功能说明:
这部分告诉 Hive,这个表的数据是按行存储的,每一行的字段之间用逗号 ,
分隔。
ROW FORMAT DELIMITED
: 使用“行格式”为分隔符格式(即每行是一个记录)FIELDS TERMINATED BY ','
: 字段之间用英文逗号分隔,适用于 CSV 文件
🔍 功能说明:
这一句表示该表的数据将以 文本文件 格式进行存储,这是 Hive 默认的存储格式。
TEXTFILE
: 数据以纯文本形式存储,通常用于 CSV、TSV 等明文文件- 其他可选格式还有:
ORC
PARQUET
AVRO
RCFILE
SEQUENCEFILE
这些格式在大数据处理中具有更高的压缩率和查询性能。
✅ 总结表格对比
部分 | 内容 | 含义 |
---|---|---|
CREATE TABLE | orders | 创建一个名为 orders 的表 |
字段定义 | order_id , user_id , order_date , order_amount , order_status | 定义字段及其数据类型 |
ROW FORMAT DELIMITED | — | 每一行是一条记录 |
FIELDS TERMINATED BY ',' | — | 字段之间用逗号分隔 |
STORED AS TEXTFILE | — | 存储格式为文本文件 |
2. 创建用户表(users)
CREATE TABLE users (user_id INT,user_name VARCHAR(50),user_age INT,user_gender VARCHAR(10),user_region VARCHAR(20)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
🧩 含义:
- 创建一个名为
users
的表。 - 表中包含以下字段及其数据类型:
user_id
: 用户ID,整型(INT)user_name
: 用户名,最大长度为50的字符串(VARCHAR)user_age
: 用户年龄,整型user_gender
: 性别,最大长度为10的字符串user_region
: 所属地区,最大长度为20的字符串
💡 Hive 中的 VARCHAR(n)
:
- Hive 并不真正支持
VARCHAR(n)
类型,它其实是模拟实现的,最终会被转换成STRING
类型。 - 推荐统一使用
STRING
类型来代替VARCHAR
,以避免兼容性问题。
✅ 最佳的写法(Hive 风格):
CREATE TABLE users (user_id INT,user_name STRING,user_age INT,user_gender STRING,user_region STRING
)
3. 创建商品表(products)
CREATE TABLE products (product_id INT,product_name VARCHAR(100),product_category VARCHAR(50),product_price DECIMAL(10, 2)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STOED AS TEXTFILE;
三、数据加载
将本地准备好的 CSV 数据文件加载到对应的 Hive 表中。
LOAD DATA LOCAL INPATH '/path/to/orders.csv' INTO TABLE orders;
LOAD DATA LOCAL INPATH '/path/to/users.csv' INTO TABLE users;
LOAD DATA LOCAL INPATH '/path/to/products.csv' INTO TABLE products;
这里的/path/to/需要替换为实际的文件存储路径。数据加载完成后,我们可以使用SELECT * FROM table_name LIMIT 10;语句查看表中部分数据,确认数据加载是否正确。
四、数据分析与查询
1. 统计每个月的订单总金额和订单数量
SELECTYEAR(order_date) AS order_year,MONTH(order_date) AS order_month,SUM(order_amount) AS total_amount,COUNT(order_id) AS order_count
FROMorders
GROUP BYYEAR(order_date), MONTH(order_date)
ORDER BYorder_year, order_month;
🔍 含义:
从 orders
表中选出以下字段:
YEAR(order_date)
:提取订单日期的年份,别名为order_year
MONTH(order_date)
:提取订单日期的月份,别名为order_month
SUM(order_amount)
:对每个月的订单金额求和,别名为total_amount
COUNT(order_id)
:统计每个月的订单数量,别名为order_count
💡 这些字段通常用于做数据报表、趋势分析、销售统计等。
🔍 含义:
指定数据来源于表 orders
,也就是之前创建的订单表。
🔍 含义:
按照 年份 + 月份 对订单数据进行分组,也就是说:
- 所有在 2024年1月 下单的数据会被归为一组
- 然后在这组内计算总销售额(
SUM(order_amount)
)和订单数(COUNT(order_id)
)
🔍 含义:
将最终结果按照 order_year
和 order_month
升序排列,让输出结果更直观、有序。
例如:2023 年 1 月 → 2023 年 2 月 → ... → 2024 年 1 月 ...
🧠 总结表格
部分 | 内容 | 功能说明 |
---|---|---|
SELECT | 提取年、月、总金额、订单数 | 定义要显示的字段 |
FROM | orders | 指定数据来源 |
GROUP BY | YEAR , MONTH | 按照年月分组聚合数据 |
ORDER BY | order_year , order_month | 按时间顺序排序输出 |
📊 示例输出(假设数据如下):
order_year | order_month | total_amount | order_count |
---|---|---|---|
2023 | 1 | 5000.00 | 20 |
2023 | 2 | 7500.00 | 25 |
2023 | 3 | 6800.00 | 22 |
💡 扩展建议
✅ 加上地区维度(用户地区)
SELECTYEAR(o.order_date) AS order_year,MONTH(o.order_date) AS order_month,u.user_region,SUM(o.order_amount) AS total_amount,COUNT(o.order_id) AS order_count
FROMorders o
JOINusers u ON o.user_id = u.user_id
GROUP BYYEAR(o.order_date), MONTH(o.order_date), u.user_region
ORDER BYorder_year, order_month, user_region;
功能 | 关键代码 |
---|---|
显示地区信息 | u.user_region |
按地区分组统计 | GROUP BY u.user_region |
按地区排序显示 | ORDER BY user_region |
2. 找出最受欢迎的商品(按订单数量统计)
SELECTp.product_name,COUNT(o.order_id) AS order_count
FROMorders o
JOINproducts p ON o.product_id = p.product_id
GROUP BYp.product_name
ORDER BYorder_count DESC
LIMIT 5;
首先这是一个非常经典的一个查询语句,个人感觉如果哪天涉及到电商方向的数分的话应该会问到(偷偷记下)
🧠 总结表格
部分 | 内容 | 功能说明 |
---|---|---|
SELECT | p.product_name , COUNT(o.order_id) | 显示商品名和订单数量 |
FROM ... JOIN | orders o JOIN products p | 关联订单表和商品表 |
GROUP BY | p.product_name | 按商品名分组统计 |
ORDER BY | order_count DESC | 按订单数从高到低排序 |
LIMIT | 5 | 只显示前5个结果 |
此查询通过内连接(JOIN)将订单表和商品表关联起来,根据商品名称分组,统计每个商品的订单数量,并按订单数量降序排列,取前 5 条数据,这样就能快速找到最受欢迎的 5 种商品。
3. 分析不同地区用户的平均订单金额
SELECTu.user_region,AVG(o.order_amount) AS average_amount
FROMorders o
JOINusers u ON o.user_id = u.user_id
GROUP BYu.user_region
ORDER BYaverage_amount DESC;
🧠 总结表格
部分 | 内容 | 功能说明 |
---|---|---|
SELECT | u.user_region , AVG(o.order_amount) | 显示地区和平均订单金额 |
FROM ... JOIN | orders o JOIN users u | 关联订单表和用户表 |
GROUP BY | u.user_region | 按地区分组统计 |
ORDER BY | average_amount DESC | 按平均金额从高到低排序 |
4. 统计每个用户的累计订单金额,并按金额进行排名
SELECTu.user_name,SUM(o.order_amount) AS total_amount,RANK() OVER (ORDER BY SUM(o.order_amount) DESC) AS amount_rank
FROMorders o
JOINusers u ON o.user_id = u.user_id
GROUP BYu.user_name
ORDER BYamount_rank;
🧠 总结表格
部分 | 内容 | 功能说明 |
---|---|---|
SELECT | user_name , total_amount , amount_rank | 显示用户名、总消费额、消费排名 |
FROM ... JOIN | orders o JOIN users u | 关联订单表和用户表 |
GROUP BY | u.user_name | 按用户名分组统计消费总额 |
RANK() OVER (...) | 排名函数 | 根据总消费额降序排名 |
ORDER BY | amount_rank | 按排名顺序展示数据 |
这里使用了窗口函数RANK(),先将订单表和用户表连接,按用户姓名分组计算每个用户的累计订单金额,然后通过RANK()函数对用户按累计金额进行排名,方便我们了解用户的消费贡献情况。
五、数据可视化与结果应用
通过上述查询,我们得到了丰富的分析结果。为了更直观地展示数据,我们可以将查询结果导出到 Excel、Tableau、PowerBI 等数据可视化工具中,生成柱状图、折线图、饼图等图表。例如,将每个月的订单总金额和订单数量生成折线图,能清晰地看到销售趋势;将不同地区用户的平均订单金额生成柱状图,便于对比各地区的消费差异。
这些分析结果可以为企业的决策提供有力支持。比如,根据最受欢迎的商品分析结果,企业可以调整库存策略,增加热门商品的备货量;通过不同地区用户的消费分析,制定针对性的市场推广策略,在消费能力高的地区加大营销投入等。
六、总结
通过这个电商销售数据分析案例,我带你简单又完整地体验了使用 Hive SQL 进行数据处理的全流程,包括数据准备、建表、数据加载、复杂查询分析以及结果应用。Hive SQL 强大的查询和分析能力,使其成为处理大数据的得力工具。在实际工作中,我们可以根据具体业务需求,灵活运用 Hive SQL 的各种语法和功能,从海量数据中挖掘出有价值的信息,为企业发展提供数据驱动的决策依据。