项目描述

以电商数据为基础,详细介绍数据处理流程,结合hive数仓、spark开发采用多种方式实现大数据分析。

数据源可通过日志采集、爬虫、数据库中取得,经过数据清洗转换导入数据仓库,通过数仓中数据分析得到数据总结,用于企业决策。本项目基于以下表类进行电商数仓分析,分为orders(用户行为表),trains(订单表),products(商品表),departments(品类表),order_products__prior(用户历史行为表),实现多维度数仓分析。

数据仓库概念:

数据仓库(Data WareHouse),简写DW,为企业决策制定过程,提供所有系统数据支持的战略集合,通过对数据仓库中的数据分析,帮助企业改进业务流程,控制成本,提高产品质量。

数据仓里不是数据的最终目的地,而是为数据最终目的地做好准备,这些准备对数据:清洗,转义,分类,重组,合并,拆分,统计

一、数据表

1.orders.csv (数据仓库中定位:用户行为表)

order_id:订单号

user_id:用户id

eval_set:订单的行为(历史产生的或者训练所需要的)

order_number:用户购买订单的先后顺序

order_dow:order day of week ,订单在星期几进行购买的(0-6)

order_hour_of_day:订单在哪个小时段产生的(0-23)

days_since_prior_order:表示后一个订单距离前一个订单的相隔天数

order_id,user_id,eval_set,order_number,order_dow,order_hour_of_day,days_since_prior_order

2539329,1,prior,1,2,08,

2398795,1,prior,2,3,07,15.0

473747,1,prior,3,3,12,21.0

2254736,1,prior,4,4,07,29.0

431534,1,prior,5,4,15,28.0

2.trains.csv

order_id:订单号

product_id:商品ID

add_to_cart_order:加入购物车的位置

reordered:这个订单是否重复购买(1 表示是 0 表示否)

order_id,product_id,add_to_cart_order,reordered

1,49302,1,1

1,11109,2,1

1,10246,3,0

1,49683,4,0

3.products.csv(数据仓库定位:商品维度表)

product_id:商品ID

product_name:商品名称

aisle_id:货架id

department_id:该商品数据属于哪个品类,日用品,或者生活用品等

product_id,product_name,aisle_id,department_id

1,Chocolate Sandwich Cookies,61,19

2,All-Seasons Salt,104,13

3,Robust Golden Unsweetened Oolong Tea,94,7

4,Smart Ones Classic Favorites Mini Rigatoni With Vodka Cream Sauce,38,1

5,Green Chile Anytime Sauce,5,13

4.departments.csv(品类维度表)

department_id:部门id, 品类id

department: 品类名称

department_id,department

1,frozen

2,other

3,bakery

5.order_products__prior.csv(用户历史行为数据)

order_id,product_id,add_to_cart_order,reordered

2,33120,1,1

2,28985,2,1

2,9327,3,0

[/infobox]

二、数据分析

1.将orders,trains建表,将数据导入到hive中?

建orders表

create table badou.orders(

order_id string

,user_id string

,eval_set string

,order_number string

,order_dow string

,order_hour_of_day string

,days_since_prior_order string)

row format delimited fields terminated by ','

lines terminated by '\n'

1.加载本地数据  overwrite 覆盖 into 追加

load data local inpath '/badou20/03hive/data/orders.csv'

overwrite into table orders

select * from orders limit 10;

hive> select * from orders limit 10;

OK

order_id user_id eval_set order_number order_dow order_hour_of_day days_since_prior_order

2539329 1 prior 1 2 08

2398795 1 prior 2 3 07 15.0

473747 1 prior 3 3 12 21.0

2254736 1 prior 4 4 07 29.0

431534 1 prior 5 4 15 28.0

2.加载hdfs数据(无local)

load data inpath '/orders.csv'

overwrite into table orders

建trains表

create table badou.trains(

order_id string,

product_id string,

add_to_cart_order string,

reordered string)

row format delimited fields terminated by ','

lines terminated by '\n'

load data local inpath '/badou20/03hive/data/order_products__train.csv' 

overwrite into table trains

2.如何去掉表中第一行的脏数据?(原数据第一行为列名,导入时要删除)

方式一:shell命令

思想:在load数据之前,针对异常数据进行处理  sed '1d' orders.csv

head -10 orders.csv > tmp.csv

cat tmp.csv

sed '1d' tmp.csv > tmp_res.csv

cat tmp_res.csv

Linux sed 命令 | 菜鸟教程

方式二:HQL (hive sql)

insert overwrite table badou.orders

select * from orders where order_id !='order_id'

insert overwrite table badou.trains

select * from trains where order_id !='order_id'

3.每个(groupby分组用户有多少个订单(count(distinct))

user_id order_id => user_id order_cnt

分组:针对不同类别进行归类,常用的 group by

结果: order count => order_cnt

select user_id, ordert_cnt 两列

第二列写法下面都可

, count(distinct order_id) order_cnt

--,count(*) order_cnt

--,count(1) order_cnt

--,count(order_id) order_cnt

完整语句:

select

user_id

, count(distinct order_id) order_cnt

from orders

group by user_id

order by order_cnt desc

limit 10

结果:两个job,Total MapReduce CPU Time Spent: 1 minutes 4 seconds 370 msec

133983 100

181936 100

14923 100

55827 100

4.每个用户一个订单平均是多少商品?

我今天购买了2个order,一个是10个商品,另一个是4个商品

(10+4)一个订单对应多少个商品 / 2

结果:一个用户购买了几个商品=7

a.先使用 priors 表,计算一个订单有多少个商品?  对应 10,4

注意:使用聚合函数(count、sum、avg、max、min )的时候要结合group by 进行使用

select

order_id,count(distinct product_id) pro_cnt

from priors

group by order_id

limit 10;

b.将priors表和order表通过order_id进行关联,将步骤a中商品数量带到用户上面

结果:用户对应的商品量

select

od.user_id, t.pro_cnt

from orders od

inner join (

select

order_id, count(1) as pro_cnt

from priors

group by order_id

limit 10000

) t

on od.order_id=t.order_id

limit 10;

c.针对步骤b,进行用户对应的商品量 sum求和

select

od.user_id, sum(t.pro_cnt) as sum_prods

from orders od

inner join (

select

order_id, count(1) as pro_cnt

from priors

group by order_id

limit 10000

) t

on od.order_id=t.order_id

group by od.user_id

limit 10;

d.计算平均

结果:用户的商品数量  / 用户的订单数量

select

od.user_id

, sum(t.pro_cnt) / count(1) as sc_prod

, avg(pro_cnt) as avg_prod

from orders od

inner join (

select

order_id, count(1) as pro_cnt

from priors

group by order_id

limit 10000

) t

on od.order_id=t.order_id

group by od.user_id

limit 10;

inner join : 多个表进行内连接

where :提取我们关注的数据

5.每个用户在一周中的购买订单的分布(列转行) ? dow  => day of week  0-6 代表周一到周日

order_dow

orderday, pro_cnt

2020-12-19  1000000

2020-12-18  1000010

user_id, dow0, dow1, dow2, dow3,dow4,dow5,dow6

1         0     3      2    2    4    0    0

2         0     5      5    2    1    1    0

注意:实际开发中,一定是最先开始使用小批量数据进行验证,验证代码逻辑的正确性,然后全量跑!!

user_id order_dow

1    0   sum=0+1=1

1    0   sum=1+1=2

1    1

2    1

方式一:

select

user_id

, sum(case when order_dow='0' then 1 else 0 end) dow0

, sum(case when order_dow='1' then 1 else 0 end) dow1

, sum(case when order_dow='2' then 1 else 0 end) dow2

, sum(case when order_dow='3' then 1 else 0 end) dow3

, sum(case when order_dow='4' then 1 else 0 end) dow4

, sum(case when order_dow='5' then 1 else 0 end) dow5

, sum(case when order_dow='6' then 1 else 0 end) dow6

from orders

-- where user_id in ('1','2','3')

group by user_id

方式一:

select

user_id

, sum(if( order_dow='0',1,0)) dow0

, sum(if( order_dow='1',1,0)) dow1

, sum(if( order_dow='2',1,0)) dow2

, sum(if( order_dow='3',1,0)) dow3

, sum(if( order_dow='4',1,0)) dow4

, sum(if( order_dow='5',1,0)) dow5

, sum(if( order_dow='6',1,0)) dow6

from orders

where user_id in ('1','2','3')

group by user_id

抽样验证结果的准确性:

user_id dow0    dow1    dow2    dow3    dow4    dow5    dow6

1         0      3       2        2       4       0       0

2         0      6       5        2       1       1       0

课堂需求:某个时间段查看每个用户购买了哪些商品?

分析:user_id, product_id

orders : order_id, user_id

trains:order_id, product_id

select

ord.user_id, tr.product_id

from orders ord

inner join trains tr

on ord.order_id=tr.order_id

where order_hour_of_day = '10'

limit 10

CREATE TABLE `udata`(

`user_id` string,

`item_id` string,

`rating` string,

`timestamp` string)

ROW FORMAT DELIMITED

注意:timestamp关键字,建表使用 ``881250949 -- > 1997-12-04 23:55:49

在udata表通过timestamp进行先后顺序的标记区分:

需求: 在推荐时候,想知道距离现在最近 或者最远的时间是什么时候?

select

max(`timestamp`) max_timestamp, min(`timestamp`) min_timestamp

from udata

max_timestamp   min_timestamp

893286638   874724710

需求:得到某一个用户具体的评论天数,结果该用户在哪些天比较活跃,可能①用户确实很活跃  ② 用户可能存在刷单的情况,刷评价

user_id ['2020-12-19','2020-12-18',....]

24*60*60

collect_list : 不去重,将所有的user_id进行收集

select collect_list('1,2,3')

select

user_id, collect_list(cast(days as int)) as day_list

from

(select

user_id

, (cast(893286638 as bigint) - cast(`timestamp` as bigint)) / (24*60*60) * rating as days

from udata

) t

group by user_id

limit 10;

需求: 用户购买的商品数量大于100的数量有哪些?

union all: 数据合并,但是数据不去重, 注意 union  all 前后的字段类型和字段个数必须保持一致

union:数据合并并且去重

方式一:

select

user_id, count(distinct product_id) pro_cnt

from

(

-- 订单训练数据  场景 整合两个新老系统数据

select

a.user_id,b.product_id

from orders as a

left join trains b

on a.order_id=b.order_id

union all

-- 订单历史数据

select

a.user_id,b.product_id

from orders as a

left join priors b

on a.order_id=b.order_id

) t

group by user_id

having pro_cnt >= 100

limit 10;

方式二:引入 with关键字,作用:涉及到逻辑很复杂,嵌套关系特别多使用,提高代码阅读性,便于排查问题

通过with修饰的可以理解为临时表或者临时数据集

with user_pro_cnt_tmp as (

select * from

(-- 订单训练数据

select

a.user_id,b.product_id

from orders as a

left join trains b

on a.order_id=b.order_id

union all

-- 订单历史数据

select

a.user_id,b.product_id

from orders as a

left join priors b

on a.order_id=b.order_id

) t

)

--, order_pro_tmp as (

--), ....

select

user_id

, count(distinct product_id) pro_cnt

from user_pro_cnt_tmp

group by user_id

having pro_cnt >= 100

limit 10;

[/infobox]

Hive电商数仓实战相关推荐

  1. 大数据电商数仓实战v5.0 (尚硅谷)

    电商数仓实战 环境搭建快速回忆 这次详细写!------阿里云ECS云服务器抢占式 1.进入环境先创建wts用户 1.useradd wts 2.passwd wts 去/home/下查看有没有wts ...

  2. 大数据Flink电商数仓实战项目流程全解(一)

    项目整体思路和架构 项目最终成果展示: 本项目主要参考尚硅谷的Flink实时数仓项目完成,最近又重新跑了一遍,项目整体我会在后续上传到码云中, 也会逐步同步更新到博客中来,里面不仅包含了整体代码和整个 ...

  3. 大数据实战项目之电商数仓(一)

    大数据实战项目之电商数仓(一) 项目介绍 数据仓库概念 ​ 数据仓库是为企业所有决策制定过程,提供所有系统数据支持的战略集合.通过对数据仓库中数据的分析,可以帮助企业改进业务流程,控制成本,提高产品质 ...

  4. 数据仓库之电商数仓-- 4、可视化报表Superset

    目录 一.Superset入门 1.1 Superset概述 1.2 Superset应用场景 二.Superset安装及使用 2.1 安装Python环境 2.1.1 安装Miniconda 2.1 ...

  5. 数据仓库之电商数仓-- 3.4、电商数据仓库系统(ADS层)

    目录 九.数仓搭建-ADS层 9.1 建表说明 9.2 访客主题 9.2.1 访客统计 9.2.2 路径分析 9.3 用户主题 9.3.1 用户统计 9.3.2 用户变动统计 9.3.3 用户行为漏斗 ...

  6. 数据仓库之电商数仓-- 3.3、电商数据仓库系统(DWT层)

    目录 八.数仓搭建-DWT层 8.1 访客主题 8.2 用户主题 8.3 商品主题 8.4 优惠券主题 8.5 活动主题 8.6 地区主题 8.7 DWT层首日数据导入脚本 8.8 DWT层每日数据导 ...

  7. 数据仓库之电商数仓-- 2、业务数据采集平台

    目录 一.电商业务简介 1.1 电商业务流程 1.2 电商常识(SKU.SPU) 1.3 电商系统表结构 1.3.1 活动信息表(activity_info) 1.3.2 活动规则表(activity ...

  8. 数据仓库之电商数仓-- 1、用户行为数据采集

    目录 一.数据仓库概念 二.项目需求及架构设计 2.1 项目需求分析 2.2 项目框架 2.2.1 技术选型 2.2.2 系统数据流程设计 2.2.3 框架版本选型 2.2.4 服务器选型 2.2.5 ...

  9. 2.东软跨境电商数仓项目技术选型

    东软跨境电商数仓项目技术选型.框架版本选型.服务器选型.集群规划 文章目录 东软跨境电商数仓项目技术选型.框架版本选型.服务器选型.集群规划 1.数据采集传输技术选型 1.1 DataX和Sqoop比 ...

最新文章

  1. td不显示边框_FANUC Series 0i Mate-TD系统上电显示SP1241 (S)D/A变换器异常维修,FANUC主板SP1_维修中心...
  2. 突破对银河系的传统认知 大量超高能宇宙加速器被发现
  3. “有效私域”加速,私域SaaS服务商提前蜕变
  4. 微信公众平台开发(76) 获取用户基本信息
  5. 那些你不知道的 getClientRects()
  6. ap设置 维盟660g_New丨维盟双频百兆11ac入墙AP:WAP-3018穿墙效果不一样!
  7. servlet过滤器入门
  8. HTML标签悬浮到最下方,HTML – 如何在兄弟姐妹的悬停上显示元素?
  9. 使用 matlab 深度学习工具训练模型
  10. access链接 mysql数据库教程_JDBC连接ACCESS数据库的三种方法
  11. C语言十折交叉验证,十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集...
  12. networkx节点显示、节点中心性度量
  13. 我又拖后腿了, 2月全国程序员平均工资13716元!
  14. 定罪了!“女版乔布斯”有可能入狱20年
  15. 2019区块链技术与应用创新峰会,UCK Network聚力技术创新 引领未来发展
  16. airflow实现Java定时任务,AirFlow定时调度执行Talend ETL任务
  17. c/c++ 洛谷 P1003 【NOIP2011 提高组】 铺地毯
  18. 一种永不止步的进取精神的勤奋
  19. GRACE重力卫星水文应用基本概念之时变重力场
  20. XXE漏洞介绍及利用

热门文章

  1. Windows2008+MyEclipse10+Android开发环境搭配
  2. Mysql server has gone away
  3. java 中的static 用法
  4. 【斐波那切数列】LeetCode 70. Climbing Stairs
  5. python/pytorch中的一些函数介绍
  6. ubuntu装机并设置远程连接
  7. torch.nn 介绍(部分)
  8. Android -- SEGV_MAPERR,SEGV_ACCERR
  9. 数据科学20个最好的Python库
  10. HDU4081 Qin Shi Huang's National Road System(次小生成树)