用Python、Hive分析Adventure Works Cycles公司

Adventure Works Cycles公司数据分析

1 背景

            Adventure Works Cycles是AdventureWorks样本数据库所虚构的公司,这是一家大型跨国制造公司。该公司生产和销售金属和复合材料自行车到北美,欧洲和亚洲的商业市场。

Adventure Works Cycle这家公司的客户主要有两种:

           • 个体:这些客户购买商品是通过网上零售店铺

           • 商店:这些是从Adventure Works Cycles销售代表处购买转售产品的零售店或批发店

这家公司主要有下面四个产品线:

            • Adventure Works Cycles 生产的自行车

            • 自行车部件,例如车轮,踏板或制动组件

            • 从供应商处购买的自行车服装,用于转售给Adventure Works Cycles的客户。

            • 从供应商处购买的自行车配件,用于转售给Adventure Works Cycles客户。

2 项目目的

            • 将数据导入Hive数据库

            • 探索数据库并罗列分析指标

            • 汇总数据建立数据仓库(销售主题)

            • powerbi可视化

            • 制作11月自行车业务分析报告

项目成果部分图片:

ppt成果图片:PPT—11月自行车业务分析报告

3 数据处理

3.1 数据来源

项目数据描述:数据来源于adventure Works Cycles公司的的样本数据库,包括了公司4大应用场景的数据:Sales、Finance、Product、Manufacture

3.2 数据理解

3.3 数据导入 

现有资料是一个从sqlserver导出的.sql文件,里面有表名、表字段以及每个表的csv数据,利用文件读写+正则表达式解析出 hive 建表语句,然后利用 pandas 指定编码读取再保存为 csv 文件

1、在hive中创建一个基础数据层库adventure_cj,用来存放基础表数据

2、在python中利用正则表达式循环读取文件,获取表名和字段名

读取文件

得到以下数据

3、解析 table_info 字典,用来创建表

4、导入数据到hive

5、用遍历文件和pandas 读取数据使之转换成指定 utf8 编码格式的代码

得到utf8编码格式的csv文件并以|分隔

6、建立数据仓库汇总层

(1)创建一个新的数据库 adventure_dw_cj,为了方便查阅将adventure_cj中的基础表迁移过来

use adventure_dw_cj;

# 销售地区维度表

create table dimsalesterritory as select * from adventure_cj.dimsalesterritory;

# 网络销售表

create table FactInternetSales as select * from adventure_cj.FactInternetSales;

# 产品维度表

create table DimProduct as select * from adventure_cj.DimProduct;

(2)建立事实表 fact_time ,对比去年、上个月的销售额、销售额数量的不同

use adventure_dw_cj;

create table fact_time as

SELECT

a.*,

  b.amount      AS amount_last_year,

  b.order_number AS order_number_last_year,

  c.amount      AS amount_last_month,

  c.order_number AS order_number_last_month,

  round(((a.amount-c.amount)/c.amount)*100,2)                  AS amount_comp_last_month,

  round(((a.order_number-c.order_number)/c.order_number)*100,2) AS order_number_comp_last_month,

  round(((a.amount-b.amount)/b.amount)*100,2) AS amount_comp_last_year,

  round(((a.order_number-b.order_number)/b.order_number)*100,2) AS order_number_comp_last_year

FROM  (

  SELECT

    SalesTerritoryKey,

    concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)) AS orderdate,

    year(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)))        AS time_YEAR,

    QUARTER(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)))      AS time_QUARTER,

    MONTH(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)))        AS time_MONTH,

    WEEKofyear(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)))  AS time_WEEK,

    count( SalesAmount )                          AS order_number,

    round(count(SalesAmount)*(0.9+rand ()*0.4),2) AS order_number_forcost,

    round( sum( SalesAmount ), 2 )                AS amount,

    round(sum(SalesAmount)*(0.9+rand ()*0.4),2)  AS amount_forcost,

    round(sum(SalesAmount)/count(SalesAmount),2)  AS customerunitprice,

    round( avg( TotalProductCost ), 2 )          AS per_productcost,

    round( avg( TaxAmt ), 2 )                    AS per_tax,

    round( avg( freight ), 2 )                    AS avg_freight

  FROM

    adventure_cj.FactInternetSales

  GROUP BY

    SalesTerritoryKey,

    OrderDateKey

  ) a

  LEFT JOIN (

    SELECT

      SalesTerritoryKey,

      OrderDateKey,

      date_add(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)), 365 ) AS orderdate,

      count( SalesAmount )            AS order_number,

      round( sum( SalesAmount ), 2 )  AS amount

    FROM

      adventure_cj.FactInternetSales

    GROUP BY

      SalesTerritoryKey,

      OrderDateKey

  ) b

ON a.SalesTerritoryKey = b.SalesTerritoryKey  AND a.orderdate = b.orderdate

LEFT JOIN (

    SELECT

      SalesTerritoryKey,

      OrderDateKey,

      date_add(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)),30) AS orderdate,

      count( SalesAmount ) AS order_number,

      round( sum( SalesAmount ), 2 ) AS amount

    FROM

      adventure_cj.FactInternetSales

    GROUP BY

      SalesTerritoryKey,

      OrderDateKey

  ) c

ON a.SalesTerritoryKey = c.SalesTerritoryKey  AND a.orderdate = c.orderdate

WHERE

  a.orderdate <= current_date()

ORDER BY

  a.SalesTerritoryKey,

  a.orderdate;

(3)创建事实表 Factinternet,对比销售额、销售数量与目标的完成率分析

use adventure_dw_cj;

create table Factinternet

as

select a.*,round(a.order_number/a.order_number_forcost,2) as order_number_forcost_comp,

round(a.order_number/a.order_number_forcost,2) as amount_forcost_comp

from (

SELECT

    a.OrderDatekey as orderdate,

    year(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)))      AS time_YEAR,

    QUARTER(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)))    AS time_QUARTER,

    MONTH(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)))      AS time_MONTH,

    WEEKofyear(concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2))) AS time_WEEK,

    a.SalesTerritoryKey,

    b.ProductSubcategoryKey,

    count( a.CustomerKey ) AS order_number,

    round(count(a.CustomerKey)* ( 0.9+rand ( ) * 0.4 ), 2 ) AS order_number_forcost,

    round( sum( a.SalesAmount ), 2 ) AS Amount,

    round(sum(SalesAmount)*(0.9+rand ()*0.4),2) AS amount_forcost,

    round(sum(a.SalesAmount)/count(a.SalesAmount),2) AS customerunitprice,

    round( avg( a.TotalProductCost ), 2 ) AS per_productcost,

    round( avg( a.TaxAmt ), 2 ) AS per_tax,

    round( avg( a.freight ), 2 ) AS avg_freight

FROM

    adventure_cj.FactinternetSales a

LEFT JOIN adventure_ods_lan.DimProduct b ON a.ProductKey = b.ProductKey

where concat_ws('-',substr(orderdatekey,0,4),substr(orderdatekey,5,2),substr(orderdatekey,7,2)) <= current_date()

GROUP BY

    a.OrderDatekey,

    a.SalesTerritoryKey,

    b.ProductSubcategoryKey) a;

7、每日定时更新数据

模拟基础数据更新,把每天新的销售数据入库到基础库中,并且更新汇总层的数据

0 1 * * * sh /root/adventure_cj/update_shell/update_data_everyday.sh   #每天1点0分执行这个脚本

4 PowerBI展示数据

借助ODBC使用powerBI连接Hive数据库

目的是从以日、月、季、年为时间维度,销售区域来分析Adventure Works Cycles这家公司的销售额、销量、客单价、平均税费、平均运费、销售额完成率、平均成本、销售大区占比以及产品销量

展示连接如下:Adventure_Work


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

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,440评论 0 13
  • 关系型数据库和SQL SQL语言的三个部分DML:Data Manipulation Language,数据操纵语...
    Awey阅读 1,937评论 0 13
  • 乾三连,坤六断,震仰盂,艮覆碗, 离中虚,坎中满,兑上缺,巽下断。
    东海翁阅读 2,251评论 0 5
  • 年初给自己预定的每日晨跑的目标,现在回头看是惨不忍睹。每天没有跑步的清晨一过,然后都在给自己打鸡血:明天早晨一定要...
    firekeeprunning阅读 271评论 1 0
  • 读书之用 著名作家、北大教授曹文轩有一次在给北大中文系新生的入学演讲中,谈到他对阅读的理解和感悟。阅读是一种人生方...
    皋辜格琢阅读 1,423评论 4 4