Hive场景模拟SQL编程实例 (销售业绩表)实验
Hive场景模拟SQL编程实例
(销售业绩表)实验
实验手册
目录
一. 实验准备................................................................................................................. 2
1.1. 实验概述........................................................................................................ 2
1.2. 实验目的........................................................................................................ 2
1.3. 实验架构........................................................................................................ 3
1.4. 实验准备....................................................................................................... 9
二. 实验步骤............................................................................................................... 12
步骤1:生成分析表.......................................................................................... 12
步骤2:进行DOD变化和YOY变化............................................................. 17
步骤3:导出分析表到本地............................................................................... 19
步骤4:删除分析表:....................................................................................... 19
三. 思考&讨论........................................................................................................... 20
一. 实验准备
1.1. 实验概述
使用商业提供的销售数据制作销售业绩日表是数据分析师的一个基本工作内容。本实验详细示范在HIVE实验环境下,整个制作销售业绩日表的步骤与流程。
1.2. 实验目的
· 熟悉销售业绩日表的模式,了解报表的基本形式。样表:
销售额 |
毛利 |
交易次数 |
平均购货篮 |
顾客人数 |
人均消费 |
|
昨天 |
¥ 49,000.78 |
¥ 19,355.31 |
149 |
¥ 328.86 |
147 |
¥ 333.34 |
今天 |
¥ 43,782.91 |
¥ 17,600.73 |
131 |
¥ 334.22 |
130 |
¥ 336.79 |
DOD变化 |
-10.65% |
-9.07% |
-12.08% |
1.63% |
-11.56% |
1.04% |
去年的今天为止 |
¥ 17,467,000.63 |
¥ 6,899,465.25 |
55673 |
¥ 313.74 |
34567 |
¥ 505.31 |
今年的今天为止 |
¥ 14,983,000.32 |
¥ 6,023,166.13 |
54673 |
¥ 274.05 |
31980 |
¥ 468.51 |
YOY变化 |
-14.22% |
-12.70% |
-1.80% |
-12.65% |
-7.48% |
-7.28% |
要求时间段:
1. 以天为计算周期,“昨天”:假设昨天是2016年5月31日
2. 以天为计算周期,“今天”:假设今天是2016年6月1日
3. 从今年1月1日到“今天”的计算周期,“今年的今天为止”:2016年1月1日至2016年6月1日。
4. 从去年1月1日到去年的“今天”的计算周期,“去年的今天为止”:2015年1月1日至2015年6月1日。
主要的Metrics:
销售额 (Revenue):按以上要求的4个时间段,计算全部合格销售的总销售额。
毛利 (Margin):按以上要求的4个时间段,计算全部合格销售的毛利。毛利为总销售额减去总商品原进价(Cost)。
交易次数 (Number of Transactions):按要求的4个时间段,计算合格销售的交易次数,一次交易只计算一次。
平均购货蓝 (Average Basket Size):按以上要求的4个时间段,计算平均每笔合格销售的交易额。
顾客人数 (Number of Customers):按以上要求的4个时间段,计算共有几位顾客进行了合格销售的交易,一位顾客只计算一次。
人均消费 (Average Spend per Customer):按以上要求的4个时间段,计算平均每一位顾客的交易额。
注释:
DOD变化:Day over Day Change,以天为单位,比较“昨天”与“今天”的Metrics变化。
YOY变化:Year over Year Change,以今年和去年同期为单位,比较“去年的今天为止”和“今年的今天为止”的Metrics变化。
不合格的销售:退货等。
l 熟练在hive环境下使用SQL语言对数据表进行操作并制作分析表。
l 熟练在hive环境下使用SQL语言对制作的分析表进行相关Metrics的计算
1.1. 实验准备
背景知识
Hadoop是用于在分布式环境中存储和处理大数据的开源框架。它包含两个模块,一个是MapReduce,另一个是Hadoop分布式文件系统(HDFS),Hadoop2.0还包括YARN,这个在前面的实验中已经描述。下图为Hadoop的生态系统:
MapReduce:它是一种并行编程模型,用于处理大量结构化,半结构化和非结构化数据。
HDFS:用于分布式存储和处理数据集。
Hadoop生态系统包含许多子项目(工具),如Sqoop,Pig和Hive。
Sqoop:用于在HDFS和RDBMS(关系数据库管理系统)之间导入和导出数据。
Hive:用类似SQL类型脚本以进行MapReduce操作的工具。
1. 使用Java MapReduce程序进行结构化,半结构化和非结构化数据的方法(前面的MapReduce实验)。
3. 使用Hive处理结构化数据的Hive查询语言(HiveQL或HQL)。
组成单元 |
描述 |
用户界面 (User interfac) |
Hive支持的用户界面是Hive Web UI,Hive命令行和Hive HD Insight(在Windows服务器中)。 |
元数据 Meta Store |
选择相应的数据库服务器(默认是Derby,也可以选择其他数据库),将表格,数据库,列的模式或元数据存储在表中,其数据类型和HDFS映射。 |
HiveQL处理引擎 (HiveQL process engine) |
HiveQL类似于SQL,用于在Metastore上查询模式信息。它可以替换用Java编写MapReduce程序,可以为MapReduce作业编写一个查询并处理它。 |
执行引擎 (Excute engine) |
HiveQL处理引擎和MapReduce的结合部分是Hive执行引擎。执行引擎处理查询并生成与用Java编写MapReduce程序相同的结果。 |
HDFS或HBASE |
Hadoop分布式文件系统或HBASE是将数据存储到文件系统中的数据存储技术。 |
HIVE的大部分命令和SQL类似,常用的命令很容易通过网上搜索找到。
一. 实验步骤
步骤1:生成分析表
1 |
CREATE TABLE IF NOT EXISTS ad_hoc_report ( |
2 |
ID BIGINT, |
3 |
Period STRING, |
4 |
Revenue BIGINT, |
5 |
Margin BIGINT, |
6 |
Number_of_Transactions BIGINT, |
7 |
Average_Basket_Size BIGINT, |
8 |
Number_of_Customers BIGINT, |
9 |
Average_Spend_per_Customer BIGINT |
10 |
); |
字段 |
含义 |
Period |
时间段 |
Revenue |
销售额 |
Margin |
毛利 |
Number_of_Transactions |
交易次数 |
Average_Basket_Size |
平均购物篮 |
Number_of_Customers |
购物人数 |
Average_Spend_per_Customer |
人均消费 |
2. 使用ecommerce.ecom_fact_sales表格计算“今天”的Metrics,同时将计算出的结果添加进分析表ad_hoc_report:
INSERT INTO TABLE ad_hoc_report SELECT 1 AS ID, 'Today' AS Period, SUM(line_item_total_amount) AS Revenue, SUM((line_item_product_price - line_item_product_cost) * line_item_quantity) AS Margin, COUNT(DISTINCT sales_key) AS Number_of_Transactions, SUM(line_item_total_amount)/COUNT(DISTINCT sales_key) AS Average_Basket_Size, COUNT(DISTINCT customer_key) AS Number_of_Customers, SUM(line_item_total_amount)/COUNT(DISTINCT customer_key) AS Average_Spend_per_Customer FROM (select * from ecom_fact_sales where line_item_quantity > 0) a Left join (select * from ecom_dim_date WHERE calendar_date = "2016-06-01") b On a.date_key = b.date_key Where b.date_key is not null ; |
3. 使用ecommerce.ecom_fact_sales表格计算“昨天”的Metrics,同时将计算出的结果添加进分析表ad_hoc_report:
INSERT INTO TABLE ad_hoc_report SELECT 1 AS ID, 'Yesterday' AS Period, SUM(line_item_total_amount) AS Revenue, SUM((line_item_product_price - line_item_product_cost) * line_item_quantity) AS Margin, COUNT(DISTINCT sales_key) AS Number_of_Transactions, SUM(line_item_total_amount)/COUNT(DISTINCT sales_key) AS Average_Basket_Size, COUNT(DISTINCT customer_key) AS Number_of_Customers, SUM(line_item_total_amount)/COUNT(DISTINCT customer_key) AS Average_Spend_per_Customer FROM (select * from ecom_fact_sales where line_item_quantity > 0) a Left join (select * from ecom_dim_date WHERE calendar_date = "2016-05-31") b On a.date_key = b.date_key Where b.date_key is not null ; |
4. 使用ecom_fact_sales表格计算“今年的今天为止”的Metrics,同时将计算出的结果添加进分析表ad_hoc_report:
INSERT INTO TABLE ad_hoc_report SELECT 2 AS ID, 'This Year' AS Period, SUM(line_item_total_amount) AS Revenue, SUM((line_item_product_price - line_item_product_cost) * line_item_quantity) AS Margin, COUNT(DISTINCT sales_key) AS Number_of_Transactions, SUM(line_item_total_amount)/COUNT(DISTINCT sales_key) AS Average_Basket_Size, COUNT(DISTINCT customer_key) AS Number_of_Customers, SUM(line_item_total_amount)/COUNT(DISTINCT customer_key) AS Average_Spend_per_Customer FROM (select * from ecom_fact_sales where line_item_quantity > 0) a Left join (select * from ecom_dim_date WHERE calendar_date >= "2016-01-01" And calendar_date <="2016-06-01" ) b On a.date_key = b.date_key Where b.date_key is not null ; |
5. 使用ecom_fact_sales表格计算“去年的今天为止”的Metrics,同时将计算出的结果添加进分析表ad_hoc_report:
INSERT INTO TABLE ad_hoc_report SELECT 2 AS ID, 'Last Year' AS Period, SUM(line_item_total_amount) AS Revenue, SUM((line_item_product_price - line_item_product_cost) * line_item_quantity) AS Margin, COUNT(DISTINCT sales_key) AS Number_of_Transactions, SUM(line_item_total_amount)/COUNT(DISTINCT sales_key) AS Average_Basket_Size, COUNT(DISTINCT customer_key) AS Number_of_Customers, SUM(line_item_total_amount)/COUNT(DISTINCT customer_key) AS Average_Spend_per_Customer FROM (select * from ecom_fact_sales where line_item_quantity > 0) a Left join (select * from ecom_dim_date WHERE calendar_date >= "2015-01-01" And calendar_date <="2015-06-01" ) b On a.date_key = b.date_key Where b.date_key is not null ; |
通过以上四段代码运行,我们已经在分析表“ad_hoc_report”中收集到“今天”,“昨天”,“今年的今天为止”,“去年的今天为止”这四个时间段的Metrics。
接下来,在步骤2,我们将利用分析表“ad_hoc_report”来计算DOD变化和YOY变化。
1 |
SELECT |
2 |
(a.Revenue - b.Revenue)/b.Revenue AS DOD_Revenue, |
3 |
(a.Margin-b.Margin)/b.Margin as DOD_Margin, |
4 |
(a.Number_of_Transactions-b.Number_of_Transactions)/b.Number_of_Transactions AS DOD_Number_of_Transactions, |
5 |
(a.Average_Basket_Size-b.Average_Basket_Size)/b.Average_Basket_Size AS DOD_Average_Basket_Size, |
6 |
(a.Number_of_Customers-b.Number_of_Customers)/b.Number_of_Customers AS DOD_Number_of_Customers, |
7 |
(a.Average_Spend_per_Customer-b.Average_Spend_per_Customer)/b.Average_Spend_per_Customer |
8 |
AS DOD_Average_Spend_per_Customer |
9 |
FROM |
10 |
(SELECT* FROM ad_hoc_report where period = 'Today') a |
11 |
LEFT OUTER JOIN |
12 |
(SELECT* FROM ad_hoc_report where period = 'Yesterday') b |
13 |
ON a.id = b.id |
16 |
; |
1 |
SELECT |
2 |
(a.Revenue - b.Revenue)/b.Revenue AS YOY_Revenue, |
3 |
(a.Margin-b.Margin)/b.Margin as YOY_Margin, |
4 |
(a.Number_of_Transactions-b.Number_of_Transactions)/b.Number_of_Transactions AS YOY_Number_of_Transactions, |
5 |
(a.Average_Basket_Size-b.Average_Basket_Size)/b.Average_Basket_Size AS YOY_Average_Basket_Size, |
6 |
(a.Number_of_Customers-b.Number_of_Customers)/b.Number_of_Customers AS YOY_Number_of_Customers, |
7 |
(a.Average_Spend_per_Customer-b.Average_Spend_per_Customer)/b.Average_Spend_per_Customer |
8 |
AS YOY_Average_Spend_per_Customer |
9 |
FROM |
10 |
(SELECT* FROM ad_hoc_report where period = 'This Year')a |
11 |
LEFT OUTER JOIN |
12 |
(SELECT* FROM ad_hoc_report where period = 'Last Year')b |
13 |
ON a.id = b.id |
16 |
; |
通过上面的两段两段运行 ,我们已经收集到DOD和YOY的数据。至此,制作销售业绩日表所需的数据已全部收集完成。有兴趣的同学可以按照实验目的里的表格标准制作表格。
步骤3:导出分析表到本地
hive -e "select * from ad_hoc_report" >> /home/cloudera/sql/report.txt |
步骤4:删除分析表:
通过以上操作, 所需数据已经全部收集完成。因为分析表会占用一定的服务器空间,为了释放和节省空间,所以我们需要把分析表“ad_hoc_report”删除:
删除分析表“ad_hoc_report”命令: Drop Table ad_hoc_report;
二. 思考&讨论
1. Hive和关系型数据库的文件储存系统不同。Hive使用HDFS,而关系型数据库则使用本地文件系统;
2. Hive和关系型数据库的计算模型不同。Hive使用MapReduce进行运算,而关系型数据库使用自己设计的模型;
3. Hive和关系型数据库的主要应用场景不同。hive是为海量数据做数据挖掘设计的,实时性差;而关系型数据库是为实时查询的业务进行设计的,实时性好;
4. Hive和关系型数据库的拓展能力不同。Hive搭建在集群上,可以通过增加集群节点的数量来对存储与计算能力进行拓展,而关系型数据库搭建在单机服务器上,不宜进行拓展;
Hive场景模拟SQL编程实例 (销售业绩表)实验相关推荐
- mysql数字辅助表_关于数字的经典SQL编程问题:数字辅助表
[IT168 技术]数字辅助表是一个只包含从1到N的N个整数的简单表,N通常很大.因为数字辅助表是一个非常强大的工具,可能经常需要在解决方案中用到它,笔者建议创建一个持久的数字辅助表,并根据需要填充一 ...
- 更新SQL Server实例所有数据库表统计信息
引出问题 自从上次菜鸟为老鸟解决了<RDS SQL SERVER 解决中文乱码问题>问题,老鸟意犹未尽,决定再想个招来刁难刁难菜鸟:"我最近做T-SQL性能调优的时候,经常发现执 ...
- duration转为时间戳_Flink Table APIamp;SQL编程指南之时间属性(3)
Flink总共有三种时间语义:Processing time(处理时间).Event time(事件时间)以及Ingestion time(摄入时间).关于这些时间语义的具体解释,可以参考另一篇文章F ...
- sql server数据库备份单个表的结构和数据生成脚本
1.使用场景:sql server数据库备份单个表的结构和数据,在我们要修改正式系统的数据的一天或者多条某些数据时候,要执行update语句操作,安全稳健考虑,最好先做好所修改的表的结构和数据备份! ...
- hive编程指南电子版_第三篇|Spark SQL编程指南
在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...
- hive编程指南_第三篇|Spark SQL编程指南
在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...
- c语言编程企业员工业绩评比,C语言 课程设计报告 员工销售业绩统计系统(9页)-原创力文档...
设 计 报 告 课题名称: 员工销售业绩统计系统 学 院: 专业班级: 电子信息工程14-1 学 号: 学 生: 指导教师: 2015年 07 月 02 日 学 生 指导教师 课题名称 员工销售业绩统 ...
- Python编程 模拟SQL语句 实现对员工信息的增删改查
一.问题描述 用 Python 模拟 sql 语句,实现对员工信息的增删改查. 封装函数,传入参数:文件路径和 sql 命令. 模拟 sql 语句实现对员工信息的现增删改查,并打印结果. 二.Pyth ...
- SQL、Hive场景题及答案
SQL.Hive场景题及答案 点赞收藏呦! 默认mysql老版本没有支持,在最新的8.0版本中支持, Oracle和Hive中都支持窗口函数,下列题目皆在Hive中实现 第一题: 了解哪些窗口函数,都 ...
最新文章
- shell里面的参数
- bg和fg指令(整理)以及 Linux中Ctrl+C、Ctrl+D等按键操作进程相关命令
- 【关于学习渗透】手把手教你玩转java反序列化cb链
- 下载android 源码对应的kernel版本
- iOS中控制器的实践和学习(2)-认识XCode4模版(A1,A3,B2简易图)
- 车载系统华山论剑:Ali OS、Android、QNX孰优孰劣
- Interface Project
- paip.asp vbs通过CLI命令行调用PHP代码
- C语言sar图像几何校正,SAR图像几何校正方法与流程
- 外卖私域流量:微信社群的运营和羊毛经济
- 如何通过云解析DNS,5步帮你实现邮箱解析
- 服务器路由器无线ap,TP-Link TL-WR841N路由器无线AP设置方法
- Document.getElement方法
- 苹果无需越狱(iPhone、iPad)手机多开教程
- 【Python入门教程】第45篇 集合的并集
- 什么电脑录音软件是最好用的
- 适配Android Q指南
- 手机PDF转换器如何实现PPT转换PDF格式
- IOS gif图片播放 swift
- 如何将电脑文件自动备份?