物流项目笔记

数据清洗规则

在我们的项目当中, 实际上数据清洗做了2件事, 第一个是按照分析需求进行数据过滤, 去重row_number()

  • 去重为什么要用row_number()?
    在我们去重的时候, 最简单的就是 distinct 弊端: 使用一个reduce进行处理, 效率低下, 生产环境一般不用
    我们常用的方式是row_number()+where rn=1 和 group by + max()

数据清洗, 思考几个问题

  1. 本地模式/集群模式
    在项目代码中提供了两种模式, 在运行时只需要通过参数传入, local/ yarn/ spark://localhost:7077
    (1) 如果是本地模式, 那么就会读取csv文件,然后分析,之后保存为csv
    (2) 如果是集群模式, 那么就会读取Hive中数据表,然后分析,之后保存为Hive中数据表
  2. 我们的参数是否要写死?
    在我们项目代码中, 参数都是通过配置文件传入的
  3. 清洗规则是什么?
    (1) 按照时间进行数据过滤
    (2) 使用row_number()对重复的数据进行去重
    (3) create_time 和 inflow_time需要进行格式化 (年-月-日 时:分:秒)

通过SQL模板和配置文件进行SQL完整SQL拼接

SELECT id,waybill_number,task_number,leave_department_code,waybill_type,waybill_weight,waybill_volume,create_time,alter_time,handle_time,valid_status,inflow_time
FROM
(SELECT id,waybill_number,task_number,leave_department_code,waybill_type,waybill_weight,waybill_volume,dateFormat(create_time) AS create_time,alter_time,dateFormat(handle_time) AS handle_time,valid_status,dateFormat(inflow_time) AS inflow_time,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY inflow_time desc ) AS CLEAN_RN
FROM ${sourceTable}
where create_time >= 'v_startTime'
) TMP
where clean_rn = 1



exp.volume_box_sourceTable=exp.volume_box
exp.volume_box_targetTable=exp.volume_box_clean
exp.volume_box_selectFields1=id,waybill_number,task_number,leave_department_code,waybill_type,waybill_weight,waybill_volume,create_time,alter_time,handle_time,valid_status,inflow_time
exp.volume_box_selectFields2=id,waybill_number,task_number,leave_department_code,waybill_type,waybill_weight,waybill_volume,dateFormat(create_time) AS create_time,alter_time,dateFormat(handle_time) AS handle_time,valid_status,dateFormat(inflow_time) AS inflow_time
exp.volume_box_whereFields1=where create_time >= 'v_startTime'
exp.volume_box_whereFields2=where clean_rn = 1
exp.volume_box_repartitionNum=1
exp.volume_box_primaryKey=id
exp.volume_box_orderBy=inflow_time desc

集群模式运行

  1. 打成jar包
  2. 在Hive中建表并加载数据
  3. 在MySQL中建表
  4. 运行jar包
spark-submit  --class cn.kgc.exp.preprocess.DataClean \
    --master yarn \
    --deploy-mode client \
    --driver-memory 4g \
    --executor-memory 2g \
    --num-executors 2 \
    --executor-cores 2 \
    kgc-1.0-SNAPSHOT.jar 1 1h 2019-12-12 18:00:00 true yarn

货量分析

线路信息包含干线, 支线, 合伙人线路
干线: 集散中心到集散中心的
支线: 集散中心到集散中心, 营业部到集散中心,集散中心到营业部,营业部到营业部(在合伙人路线).

  1. 准备组织机构信息
    (1)有重复数据,可以在数据清洗阶段对数据去重,也可以现在进行去重
    (2)过滤出有效部门
select *
from 
(
select *,row_number() over(distribute by id sort by create_time desc) rn 
from volume_basic
where is_active='Y'
) tmp
where tmp.rn=1
  1. 准备未签收运单表
    (1)运单表当中包括已签收和未签收

    思路:用运单表 left join 签收表 where 签收表 is null

  2. 准备库存表去重记录
    思路:使用row_number去重

  3. 准备基础线路表
    (1)将干线,支线,合伙人路线三张表整合到一张表
    (2)三张表中线路可能会有重复的
    思路:
    (1)使用union将三张表信息select * from 出来
    (2)使用group by + max() 进行去重

  4. 修正车辆信息线路表
    正常路线: a -> A , A -> a , A -> B
    异常路线: a -> b -> A 在我们的数据文件中体现的数据为 a -> b, b -> A
    修正路线: 把 a -> b -> A 修正为 a -> A

    举个例子:有一张表
    出发部门, 到达部门, 出发时间
    10000001, 10000002, 6:00
    10000002, 10000003, 6:00
    10000004, 10000005, 6:00

    现在进行关联: a表和b表

    a表
    出发部门, 到达部门, 出发时间
    10000001, 10000002, 6:00
    10000002, 10000003, 6:00
    10000004, 10000005, 6:00

    b表
    10000001, 10000002, 6:00
    10000002, 10000003, 6:00
    10000004, 10000005, 6:00

    a表 left join b表 on a表.到达部门=b表.出发部门

    出发部门, 到达部门, 出发时间, 出发部门, 到达部门, 出发时间
    10000001, 10000002, 6:00 , 10000002, 10000003, 6:00
    10000002, 10000003, 6:00 , NULL , NULL , NULL
    10000004, 10000005, 6:00 , NULL , NULL , NULL

    where 路线类型为合伙人路线
    出发部门, 到达部门, 出发时间, 出发部门, 到达部门, 出发时间
    10000001, 10000002, 6:00 , 10000002, 10000003, 6:00

    select a.出发部门,b表的到达部门,出发时间

  5. 准备发车详细信息表,包括运单的运单号,重量,体积,出发部门,到达部门,出发时间,到达时间,预计达到时间
    思路:
    (1)关联装车表,装车明细表,袋装信息表,任务表,任务明细表 去重row_number 作为临时表a
    (2)用临时表a关联运单表,获取详细信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值