开发者学堂课程【大数据 Spark2020版(知识精讲与实战演练)第四阶段: 数据清洗_剪除反常数据_统计分布】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/691/detail/12116
数据清洗_剪除反常数据_统计分布
数据清洗针对这一数据或字段为空,转换错了,包裹将数据转换成功,真正意义上数据清洗有一个步骤看到某一部分数据是否有问题。
假设所有的行车数据都分布在一个小时或三个小时以内,突然有一个十个小时的数据,是一个奇怪反常的数据,应该删掉
剪除反常数据,因为反常数据会影响最终的结果
要看到反常数据,编写代码剪除
看到反常数据要知道如何做,筛选数据集看到反常数据
观察数据集的时间分布
观察数据分布常用手段是直方图,直方图反应的是数据的“数量”分布
行程数据从上车时间到下车时间的差值,即行程时间,要去掉反常的行程时间,先看到行程时间分布,用直方图
直方图是数据可视化中非常重要的图
有一个数据集是乘客的数据集,横轴表示乘客年龄的范围,纵轴代表人数,数据有多高代表在这个范围内乘客个数是多少,直方图用于统计一个数据的一个列,列中数据分布情况,如10-20岁有多少个,20-30有多少个
通过这个图可以看到其实就是乘客年龄的分布,横轴是乘客的年龄,纵轴是乘客年龄的频数分布
因为我们这个项目中要对出租车利用率进行统计,所以需要先看—看单次行程的时间分布情况,从而去掉一些异常数据,保证数据是准确的
绘制直方图的"图""留在后续的 DNP项目中再次介绍,现在先准备好直方图所需要的数据集,通过数据集来观察即可,直方图需要的是两个部分的内容,一个是数据本身,另外一个是数据的分布,也就是频数的分布,步骤如下
(1)计算每条数据的时长,但是单位要有变化,按照分钟,或者小时来作为时长单位
(2)统计每个时长的数据量,例如有500个行程是一小时内完成的,有 300个行程是1-2小时内完成
观察数据分布,通过直方图观察,直方图与数据图是有明显差别的
如果无法将直方图的图画出,可以将直方图显示的数据显示出来,统计时间分布直方图,直接看到结果集,通过结果集反映问题
看行程时间分布,处理数据集
进入 idea
taxiGood 是转换过,没有任何问题的数据
//5.绘制时长直方图
使用 dropOffTime-pickUpTime,得到行程的时长,计算出用毫秒表示的数据后,转到更高的力度,如分钟、小时,进而进行处理
编写 UDF
//5.绘制时长直方图
//5.1编写 UDF 完成时长计算,将毫秒转为小时单位
接收 pickUpTime 与 dropOffTime,都是 Long 类型的,毫秒制,生成函数体,在函数体中计算 duration,即 dropOffTime-pickUpTime,使用 TimeUnit 进行转换,转成小时单位,执行 convert,获取小时表示,函数作用于每一条数据,直接作用于整个数据集,要转成 UDF,使用 UDF 函数接收 hours,UDF 生成,可以进行具体统计
//5.2进行统计
要看到时长分布,数据集是两列构成,结果集第一列是时长 hours,第二列是 count,按照时长进行分组,分组完求 count
拿到时长,第一列是 pickUpTime,第二列是 dropOffTime,执行转换操作,转换操作结束后,生成数据可能是不合适的,转为 duration,执行 count,进行统计,统计完通过 sort 进行排序处理,最终展示数据,直方图绘制完成
创建一个 UDF,使用 UDF 统一一个新的列,新的列是 groupBy 统计,按照小时分组,分组完使用 count 和 sort 排序,最终展示
//5.绘制时长直方图
//5.1编写 UDF 完成时长计算,将毫秒转为小时单位
val hours = (pickUpTime: Long,dropoffTime: Long) =>{
val duration = dropoffTime - pickupTime
val hours = TimeUnit.HOURS.convert(duration,Timeunit.MILLISECONDS)hours
}
val hoursUDF = udf(hours)
// 5.2进行统计
taxiGood.groupBy(hoursUDF($"pickupTime" ,$"dropoffTime") as "duration")
.count()
.sort( sortCol = "duration")
.show()
运行代码
结果总共10000条数据,9999条数据在1个小时以内,1条数据一个小时到两个小时之间,可以将1剪掉,如果拿到整个几千万条数据,在0-3小时分布数据较多,要剪掉0-3小时以外的数据。
第一步看到整个数据分布,接下来剪掉多余数据