Adventure业务分析BI项目

简介

项目介绍: Adventure Works Cycles 是一家销售自行车及相关零件的公司,通过现有数据监控销售情况,获取最新商品销售趋势及区域分布情况进行可视化展示,为业务决策提供洞察,实现高效经营。
负责内容:1. 根据实际业务需要,使用python+SQL语句对ODS基础层数据聚合加工,提取关键分析指标,并加载到DW汇总层,最终形成三张聚合表(订单日期聚合表、同比数据表和时间地区产品聚合表)。

  1. 在Linux环境下使用shell命令后台运行脚本,实现BI看板所需三张聚合数据表按逻辑顺序的每日自动更新。
  2. 使用PowerBI连接MySQL数据库实现Sales Dashboard,包括销售情况、时间趋势、区域分布指标的可视化监控。主要从时间、地区和产品维度,展示订单量、销售额、客单价、销售产品结构和销售预期达成率等关键指标。

可视化看板截图

image.png

image.png
image.png

一、背景介绍

Adventure Works Cycles是基于微软SQL Server中AdventureWorks 示例数据库所构建的虚拟公司,它是一家大型跨国制造公司。该公司向北美,欧洲和亚洲商业市场生产并销售金属和复合材料自行车。尽管其基本业务位于华盛顿州的博塞尔市,拥有290名员工,但几个区域销售团队遍布整个市场。

二、分析目的:

为满足业务团队自主分析,并基于销售情况快速做出决策的需求。要求数据部门和业务部门沟通需求的数据指标,考虑实现数据自动聚合更新并输出可视化看板。

三、分析框架

image.png

四、分析过程

1. 数据指标梳理与理解

目的:探索现有数据库包含哪些表和字段,结合业务需求,梳理可分析的指标。

(1) 数据库探索

数据库共有6张表,且主要可以分成三类,一类是ods开头的明细表(订单明细表、每日新增用户表),一类是dw开头的聚合表(时间地区产品聚合表、每日环比表和当日维度表),还有一种dim开头的维度表(日期维度表)。

(2) 数据梳理

根据业务理解并与相关同事沟通了解,对项目会用到的数据表和字段进行梳理,形成数据字典。具体字段内容如下:

adventure数据字典.png
(3) 指标体系

分析所需指标:

  1. 时间维度——年、季度、月、昨日、今日
  2. 地区维度——区域、省份、城市
  3. 订单产品维度——订单日期、客户编号、产品类别、产品子类、产品名、产品单价、产品销售数量
  4. 各类同比(如消费金额、定单量、单均价等)及占比值(如产品类别)

2. 利用python进行底层数据聚合

根据业务需要,接下来对基础层数据聚合加工,提取关键分析指标,形成三张聚合表(订单日期聚合表、同比数据表和新的时间地区产品聚合表)。具体处理逻辑梳理如下:

Adventure项目.jpg
(1) 订单日期聚合表

从Mysql数据库中获取ods_sales_orders订单明细表并按日期分组聚合,计算每日总金额、订单量和客单价。读取dim_date_df日期维度表,与上表结合,得到dw_order_by_day订单日期聚合表。 部分代码如图:

image.png
(2) 同比数据表

从Mysql数据库中获取上一步生成的dw_order_by_day订单日期聚合表,对当日/昨天/当月/当季/当年标签进行判断,计算各时间维度下与去年同期的总金额、订单量和客单价同比数据。得到dw_amount_diff当日维度表,部分代码如图:

image.png
image.png
(3) 当日时间地区产品聚合表

读取并聚合当日的ods_sales_orders订单明细表、ods_customer每日新增用户表和dim_date_df日期维度表,形成dw_customer_order当日时间地区产品聚合表。部分代码如图:

image.png

3. 在Linux服务器上部署代码,让其每日自动更新

这里使用python的schedule模块实现数据自动更新,部分代码实现如下:

image.png

接着,将写好的定时任务脚本传到Linux服务器中,并挂到后台运行。

nohup python3 -u schedule_job_test.py > schedule_job_test.log 2>&1 &

此时定时文件被运行,会返回一个任务ID。

image.png

使用以下语句查看新建的任务ID,确定其是否成功在后台运行。

ps aux| grep schedule_job_test.py 
image.png

查看任务日志。

cat schedule_job_test.log
image.png

说明该任务在后台自动运行,并每十秒输出一段日志。
完成以上操作后只要云服务器保持开启状态,后台就会每日自动更新所需表。需要中止后台任务可使用命令——kill 任务ID。

4. 连接Power bi 部署展示

使用Power BI链接新生成的三张聚合表,并通过web发布形成链接。
可视化看板链接

image.png
image.png
image.png

5. 实现hive数据仓库以及处理日常需求

随着数据量增大,使用python进行聚合变的困难起来,为解决大数据场景问题,以下引入hive代替python进行数据聚合。主要流程为使用sqoop抽取数据进入hive数据库,在hive中进行数据聚合,Linux服务器部署自动更新,使用sqoop将更新后数据传输回Mysql。

Sqoop:SQL-to-Hadoop

把关系型数据库的数据导入到 Hadoop 系统 ( 如 HDFS、HBase 和 Hive) 中;把数据从 Hadoop 系统里抽取并导出到关系型数据库里。利用MapReduce 加快数据传输速度。

(1) Sqoop抽取mysql数据到hive

import sqoop
步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;
步骤2:Sqoop启动一个Map-Only的MR作业,利用元数据信息并行将数据写入Hadoop。

把dim_date_df日期维度表、ods_customer每日新增用户表和ods_sales_orders订单明细表数据通过sqoop工具迁移到Hive的ods库中。以dim_date_df日期维度表为例编写shell脚本,其他两张表同理:

hive -e "drop table if exists ods.dim_date_df" # 删除hive原有的旧表
sqoop import \ 
--hive-import \ 
--connect jdbc:mysql:///主机名:端口/目录名 \  
--driver com.mysql.jdbc.Driver \ # Hadoop根目录
--username xxxxx \   #用户名
--password xxxxx \      #密码
--query \  ## 构建表达式<sql语句 >执行
"select * from dim_date_df where "'$CONDITIONS'" " \
--fetch-size 50000 \  ## 一次从数据库读取 n 个实例,即n条数据
--hive-table ods.dim_date_df \ ## 创建dim_date_df表
--hive-drop-import-delims \  ## 在导入数据到hive时,去掉数据中的\r\n\013\010这样的字符
--delete-target-dir \  ## 如果目标文件已存在就把它删除
--target-dir /user/hadoop/sqoop/dim_date_df \  ## 数据文件被放在了hive的默认/user/hadoop/sqoop/dim_date_df下面
-m 1  ## 迁移过程使用1个map(开启一个线程)
image.png
(2) 建立数据仓库,做聚合数据处理

编写Hive SQL,放到shell脚本中运行,这里以聚合生成dw_order_by_day每日环比表为例,同理生成其他两张表。

hive -e "drop table if exists ods.dw_order_by_day"
hive -e "
CREATE TABLE ods.dw_order_by_day(
  create_date string,
  is_current_year bigint,
  is_last_year bigint,
  is_yesterday bigint,
  is_today bigint,
  is_current_month bigint,
  is_current_quarter bigint,
  sum_amount double,
  order_count bigint)
"
hive -e "
with dim_date as
(select create_date,
            is_current_year,
            is_last_year,
            is_yesterday,
            is_today,
            is_current_month,
            is_current_quarter
            from ods.dim_date_df),
sum_day as
(select create_date,
        sum(unit_price) as sum_amount,
        count(customer_key) as order_count
        from ods.ods_sales_orders
        group by create_date)
insert into ods.dw_order_by_day
    select b.create_date,
    b.is_current_year,
    b.is_last_year,
    b.is_yesterday,
    b.is_today,
    b.is_current_month,
    b.is_current_quarter,
    a.sum_amount,
    a.order_count
    from sum_day as a
    inner join dim_date as b
    on a.create_date=b.create_date
"
(3) Sqoop从hive导出数据到mysql

export sqoop
将数据从Hadoop 导入关系型数据库导中。
步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;
步骤2:并行导入数据 :将Hadoop 上文件划分成若干个split.每个split 由一个Map Task 进行数据导入。

编写Hive SQL,放到shell脚本中运行,这里将dw_order_by_day每日环比表的数据抽取回mysql数据库为例,同理生成其他两张表。

sqoop export \
--connect "jdbc:mysql://主机名:端口/目录名" \
--username xxxxx \ ##数据库账号 
--password xxxxx \ ##数据库密码
--table dw_order_by_day \
--export-dir /user/hive/warehouse/ods.db/dw_order_by_day \
--input-null-string "\\\\N" \
--input-null-non-string "\\\\N"  \
--input-fields-terminated-by "\001"  \
--input-lines-terminated-by "\\n"  \
-m 1
(4) Linux服务器定时更新部署

linux的定时任务使用crontab文件来实现

1. 编写job_shedule.sh文件,按执行顺序添加文件
sh /home/xxx/sqoop_dim_date_df.sh
sh /home/xxx/sqoop_ods_customer.sh
sh /home/xxx/sqoop_ods_sales_order.sh
sh /home/xxx/create_dw_order_by_day.sh
sh /home/xxx/create_dw_amount_diff.sh
sh /home/xxx/create_dw_customer_order.sh
sh /home/xxx/create_dw_order_by_day.sh
sh /home/xxx/create_dw_amount_diff.sh
sh /home/xxx/create_dw_customer_order.sh
2. 添加定时任务,设定每天早上6点执行

编辑crontab 文件

vi /etc/crontab

添加定时任务:

0 6 * * * sh home/xxx/job_schedule.sh > /dev/null 2>&1  ##避免当程序在指定的时间执行后,系统发一封邮件给当前的用户,显示该程序执行的内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容