一零四八、Spark数据清洗 模块C:数据清洗与挖掘分析(4)
迪丽瓦拉
2024-05-13 09:06:35
0

项目背景说明

餐饮外卖平台的核心价值体现在配送,而配送的价值则依赖于商家与客户的双向选择。外卖平台通常会通过内容激活消费者和商家两个群体的活跃度。消费者会参考平台展示的内容选择商家,商家也会以消费者评价与平台统计数据为依据调整策略,由此再吸引更多的用户下单、评论、形成正向循环。保证配送的时效与品质是从优化用户体验的角度,吸引更多的用户参与,进而带动商家不断入驻。由此,商家、消费者、骑手在平台上形成越来越多的真实可靠的数据,帮助消费者更好的做出消费决策,同时促进商家提高服务质量。而平台通过数据,不断调整优化服务,从而不断提升这种多边网络效应。提升网络效应的直接结果就是用户和商家规模大幅提升,进而形成规模效应——降低获客成本、提高效益,并且不断提升自己的行业壁垒。

为探索各大外卖平台的市场策略与经营模式,现已从及平台获取到了原始数据集,包含“id,request_id,walle_id,retailer_id,retailer_name,retailer_address,etailer_location,city_id,city_name,grid_id,carrier_id,team_id,applicant_id,applicant_name,first_auditor_role,first_auditor_candidate_ids,first_auditor_id,first_auditor_name,second_auditor_role,second_auditor_candidate_ids,second_auditor_id,second_auditor_name,status,max_distance_before_edit,min_distance_before_edit,max_distance_after_edit,min_distance_after_edit,area_before_edit,area_after_edit,created_at,updated_at,申请时间,创建时间”等字段,为保障用户隐私和行业敏感信息,已经对数据脱敏。数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或一些商业性敏感数据的情况下,对真实数据进行改造并提供测试使用,如身份证号、手机号等个人敏感信息都需要进行数据脱敏。本题已将脱敏后的数据存放于Master节点/chinaskills目录下。任务中所有命令务必使用绝对路径。

任务二:数据挖掘分析

任务背景:

外卖的配送范围一般由外卖平台的业务人员为商家设定,商家也可以根据实际情况向平台申请修改配送范围。在申请配送范围修改时,审核员将考虑实际道路限制、综合运力成本、顾客等待时长等因素,对配送范围变更的申请进行考量,最终做出通过/拒绝/驳回的结果判定。一级审核员通常为该地区的渠道经理,针对运力等综合因素对审核记录进行考量;二级审核员为外卖平台专职审核人员,将综合考虑配送范围的合理性及更改后的用户体验。考核员的审核具有一定的时效要求,审核效率直接影响合作商家平台活跃性以及商家的合作体验。下面请根据任务具体要求,分析范围审核相关数据。

任务描述:

请根据你的数据清洗的结论数据源(/diliveryoutput2),编写 Spark 程序,按照如下要求实现对数据的分析,并将结果输出至 HDFS 文件系统中。

1) 解析数据清洗任务结果数据集

2) 计算配送范围申请的审核时长

3) 分析配送范围变更幅度对审核结果的影响

4) 程序打包并在Spark平台运行,结果输出至HDFS文件系统(/diliveryoutput3)

具体任务要求

2、为保证用户体验,申请的审批应具有时效性。公司规定在当天18:00前递交的范围审核申请,处理时间应在12小时以内;在当天18:00后递交的范围审核申请,应在第二天中午12:00前审核完成。请根据这一标准,分别统计全部数据记录中,在18:00前/后递交的申请超时记录数,在并在程序中以打印语句输出结果。将打印输出结果复制并粘贴至对应报告中。(复制内容需包含打印语句输出结果的上下各 5 行运行日志)。

示例格式:

===18:00前递交申请的记录中,超时记录数为*条===

===18:00后递交申请的记录中,超时记录数为*条===
 

package eatimport org.apache.spark.sql.{DataFrame, SparkSession}import java.text.SimpleDateFormat
import java.util.Dateobject three_2 {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder().master("local[6]").appName("three_2").config("spark.sql.warehouse.dir", "C:/").getOrCreate()val datas: DataFrame = spark.read.json("data/output/diliveryoutput2")datas.createOrReplaceTempView("middle")spark.udf.register("mid", (create: String, end: String) => {val format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")val data1: Date = format.parse(create)val data2: Date = format.parse(end)var res = "0"if (data1.getHours < 18) {if (data2.getHours >= data1.getHours + 12) {res = "1"}}if (data1.getHours >= 18) {if (data2.getDay <= (data1.getDay + 1) && data2.getHours < 12) {} else {res = "2"}}res})val sql1 ="""|select * from middle where mid(`创建时间`,`申请时间`) = 1|""".stripMarginval count1: Long = spark.sql(sql1).count()val sql2 ="""|select * from middle where mid(`创建时间`,`申请时间`) = 2|""".stripMarginval count2: Long = spark.sql(sql2).count()println(s"===18:00前递交申请的记录中,超时记录数为${count1}条===")println(s"===18:00后递交申请的记录中,超时记录数为${count2}条===")}
}

相关内容