数据分析及应用:滴滴出行打车日志数据分析

莱莱  金牌会员 | 2024-12-6 18:58:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 837|帖子 837|积分 2511

目录
0 日志数据集先容
1 构建数据堆栈 
1.1 ods创建用户打车订单表
1.2 创建分区
1.3 上传到对应分区
1.4 数据预处理
 2 订单分析
2.1 app层建表
 2.2 加载数据到app表
 2.3 差别地域订单占比分析(省份)


0 日志数据集先容

以下就是一部门用户打车的日志文件。
   b05b0034cba34ad4a707b4e67f681c71,15152042581,109.348825,36.068516, 陕 西 省 , 延 安 市,78.2,男,软件工程,70后,4,1,2020-4-12 20:54,0,2020-4-12 20:06
  23b60a8ff11342fcadab3a397356ba33,15152049352,110.231895,36.426178, 陕 西 省 , 延 安 市,19.5,女,金融,80后,3,0,0,2020-4-12 4:04
  1db33366c0e84f248ade1efba0bb9227,13905224124,115.23596,38.652724, 河 北 省 , 保 定 市,13.7,男,金融,90后,7,1,2020-4-12 10:10,0,2020-4-12 0:29
  日志包含了以下字段:
 
1 构建数据堆栈 

为了方便构造、管理上述的三类数据,我们将数仓分成差别的层,简朴来说,就是分别将三类差别 的数据保存在Hive的差别数据库中。

  1. -- 1.1 创建ods库
  2. create database if not exists ods_didi;
  3. -- 1.2 创建dw库
  4. create database if not exists dw_didi;
  5. -- 1.3 创建app库
  6. create database if not exists app_didi;
复制代码
1.1 ods创建用户打车订单表

  1. -- 2.1 创建订单表结构
  2. create table if not exists ods_didi.t_user_order(
  3.   orderId string comment '订单id',
  4.   telephone string comment '打车用户手机',
  5.   lng string comment '用户发起打车的经度',
  6.   lat string comment '用户发起打车的纬度',
  7.   province string comment '所在省份',
  8.   city string comment '所在城市',
  9.   es_money double comment '预估打车费用',
  10.   gender string comment '用户信息 - 性别',
  11.   profession string comment '用户信息 - 行业',
  12.   age_range string comment '年龄段(70后、80后、...)',
  13.   tip double comment '小费',
  14.   subscribe integer comment '是否预约(0 - 非预约、1 - 预约)',
  15.   sub_time string comment '预约时间',
  16.   is_agent integer comment '是否代叫(0 - 本人、1 - 代叫)',
  17.   agent_telephone string comment '预约人手机',
  18.   order_time string comment '预约时间'
  19. )
  20. partitioned by (dt string comment '时间分区')
  21. ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
复制代码
1.2 创建分区

  1. alter table ods_didi.t_user_order add if not exists partition(dt='2020-04-12');
复制代码
1.3 上传到对应分区

  1. -- 上传订单数据
  2. hadoop fs -put /root/data/didi/order.csv /user/hive/warehouse/ods_didi.db/t_user _order/dt=2020-04-12
  3. -- 查看文件
  4. hadoop fs -ls /user/hive/warehouse/ods_didi.db/t_user_order/dt=2020-04-12
  5. -- 查看是否映射成功
  6. select * from ods_didi.t_user_order limit 10
复制代码
1.4 数据预处理

目的重要是让预处理后的数据更轻易举行数据分析,并且能够将一些非法 的数据处理掉,避免影响实际的统计结果
dw层创建宽表: 
  1. create table if not exists dw_didi.t_user_order_wide(
  2.     orderId string comment '订单id',
  3.     telephone string comment '打车用户手机',
  4.     lng string comment '用户发起打车的经度',
  5.     lat string comment '用户发起打车的纬度',
  6.     province string comment '所在省份',
  7.     city string comment '所在城市',
  8.     es_money double comment '预估打车费用',
  9.     gender string comment '用户信息',
  10.     profession string comment '用户信息',
  11.     age_range string comment '年龄段(70后、80后、',
  12.     tip double comment '小费',
  13.     subscribe integer comment '是否预约(0 - 非预约、1 - 预约)',
  14.     subscribe_name string comment '是否预约名称',
  15.     sub_time string comment '预约时间',
  16.     is_agent integer comment '是否代叫(0 - 本人、1 - 代叫)',
  17.     is_agent_name string comment '是否代叫名称',
  18.     agent_telephone string comment '预约人手机',
  19.     order_date string comment '预约日期,yyyy-MM-dd',
  20.     order_year integer comment '年',
  21.     order_month integer comment '月',
  22.     order_day integer comment '日',
  23.     order_hour integer comment '小时',
  24.     order_time_range string comment '时间段',
  25.     order_time string comment '预约时间'
  26. )
  27. partitioned by (dt string comment '按照年月日来分区')
  28. row format delimited fields terminated by ',';
复制代码

预处理需求
   

  • 过滤掉order_time长度小于8的数据,假如小于8,表现这条数据不正当,不应该到场统计。
  • 将一些0、1表现的字段,处理为更轻易理解的字段。比方:subscribe字段,0表现非预约、1表 示预约。我们必要添加一个额外的字段,用来展示非预约和预约,如许将来我们分析的时候,跟容 易看懂数据。
  • order_time字段为2020-4-12 1:15,为了将来更方便处理,我们同一使用类似 2020-04-12 01:15 来表现,如许所有的order_time字段长度是一样的。并且将日期获取出来
  • 为了方便将来按照年、月、日、小时统计,我们必要新增这几个字段。
  • 后续要分析一天内,差别时段的订单量,我们必要在预处理过程中将订单对应的时间段提前计 算出来
  数据加载到dw层宽表 
HQL编写好后,为了方便后续分析,我们必要将预处理好的数据写入到之前创建的宽表中。注意: 宽表也是一个分区表,所以,写入的时候肯定要指定对应的分区。 
  1. insert overwrite table dw_didi.t_user_order_wide partition(dt = '2020-04-12')
  2. select
  3.     orderId,
  4.     telephone,
  5.     long,
  6.     lat,
  7.     province,
  8.     city,
  9.     es_money,
  10.     gender,
  11.     profession,
  12.     age_range,
  13.     tip,
  14.     subscribe,
  15.     case when subscribe = 0 then '非预约'
  16.          when subscribe = 1 then '预约'
  17.     end as subscribe_name,
  18.     sub_time,
  19.     is_agent,
  20.     case when is_agent = 0 then '本人'
  21.          when is_agent = 1 then '代叫'
  22.     end as is_agent_name,
  23.     agent_telephone,
  24.     date_format(order_time, 'yyyy-MM-dd') as order_date,
  25.     year(order_time) as year,
  26.     month(order_time) as month,
  27.     day(order_time) as day,
  28.     hour(order_time) as hour,
  29.     case when hour(order_time) >= 1 and hour(order_time) < 5 then '凌晨'
  30.         when hour(order_time) >= 5 and hour(order_time) < 8 then '早上'
  31.         when hour(order_time) >= 8 and hour(order_time) < 11 then '上午'
  32.         when hour(order_time) >= 11 and hour(order_time) < 13 then '中午'
  33.         when hour(order_time) >= 13 and hour(order_time) < 17 then '下午'
  34.         when hour(order_time) >= 17 and hour(order_time) < 19 then '晚上'
  35.         when hour(order_time) >= 19 and hour(order_time) < 20 then '半夜'
  36.         when hour(order_time) >= 20 and hour(order_time) < 24 then '深夜'
  37.         when hour(order_time) >= 0 and hour(order_time) < 1 then '凌晨'
  38.     end as order_time_range,
  39.     date_format(order_time, 'yyyy-MM-dd HH:mm') as order_time
  40. from
  41.     ods_didi.t_user_order
  42. where
  43.     dt = '2020-04-12' and
  44.     length(order_time) >= 8;
复制代码
 2 订单分析

2.1 app层建表

数据分析好了,但要知道,我们处理大规模数据,每次处理都必要占用较长时间,所以,我们可以 将盘算好的数据,直接保存下来。将来,我们就可以快速查询数据结果了。所以,我们可以提前在 app层创建好表
  1. -- 创建保存日期对应订单笔数的app表
  2. create table if not exists app_didi.t_order_total(
  3.         date string comment '日期(年月日)',
  4.   count integer comment '订单笔数'
  5. )
  6. partitioned by (month string comment '年月,yyyy-MM')
  7. row format delimited fields terminated by ',';
复制代码
 2.2 加载数据到app表

  1. insert overwrite table app_didi.t_order_total partition(month='2020-04')
  2. select
  3.         '2020-04-12',
  4.         count(orderid) as total_cnt
  5. from
  6.         dw_didi.t_user_order_wide
  7. where
  8.    dt = '2020-04-12';
复制代码
 2.3 差别地域订单占比分析(省份)

  1. create table if not exists app_didi.t_order_province_total(
  2.         date string comment '日期',
  3.         province string comment '省份',
  4.         count integer comment '订单数量'
  5. )
  6. partitioned by (month string comment '年月,yyyy-MM')
  7. row format delimited fields terminated by ',';
  8. insert overwrite table app_didi.t_order_province_total partition(month = '2020-04')
  9. select
  10.     '2020-04-12',
  11.     province,
  12.     count(*) as order_cnt
  13. from
  14.         dw_didi.t_user_order_wide
  15. where
  16.     dt = '2020-04-12'
  17. group by province;
复制代码

 
假如您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建立实践之路专栏,这里的内容会更精彩。
专栏 原价99,如今活动价59.9,按照门路式增长,还差5个人上升到69.9,终极恢复到原价
专栏优势:
(1)一次收费持续更新。
(2)实战中总结的SQL本事,帮助SQLBOY 在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【全网唯一讲SQL实战本事,方法独特】
SQL很简朴,可你却写不好?天天一点点,收获不止一点点-CSDN博客
(3)实战中数仓建模本事总结,让你认识不一样的数仓。【数据建模+业务建模,不一样的认知体系】(假如只懂数据建模而不懂业务建模,数仓体系认知是不全面的
(4)数字化建立当中碰到难题办理思绪及问题思考。
我的专栏具体链接如下:
  数字化建立通关指南_莫叫石榴姐的博客-CSDN博客 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表