什么是数据清洗?
数据清洗是指在数据分析或处理之前,对原始数据进行预处理,以消除错误、不一致、重复或缺失的数据,从而提高数据的质量和可用性。数据清洗是数据科学和数据分析中至关重要的一步,因为低质量的数据会导致错误的结论和决策。
假设你有一个包含用户信息的文本文件,每行格式为 姓名,年龄,性别,需要清洗掉年龄为空或者非数字的行。
以下是 10 条符合上述示例中数据格式(姓名,年龄,性别)的测试数据,包含了一些可能需要清洗掉的无效数据,你可以将其保存为一个文本文件,用于测试上面的数据清洗程序。
【教师展示要清洗的数据,请同学们观察,并回答应该要清洗掉哪些数据?】
张三,25,男
李四,,女
王五,30,男
赵六,a,女
孙七,35,男
周八,40,女
吴九,abc,男
郑十,45,女
王十,50,男
李二,55,女
这里面:“李四” 的年龄为空,“赵六” 和 “吴九” 的年龄不是有效的数字,在执行数据清洗程序时,这些行应该会被过滤掉。
实现这个问题的思路是什么?
- 读入文件
- 对每一行数据进行分析
- 字段拆分,拆分出年龄这个字段
- 判断
- 如果它不是数字或者缺失,则忽略这条数据
- 否则保存
- 如何读入txt文件?
- 如何拆分出一行中的年龄?
- 如何使用过滤算子(filter)?
- 如何判断是否是整数?
- 读入txt文件。 val lines = sc.textFile(inputFile)
- 对拆分出一行中的年龄。val fields = line.split(",") fields(0)
- 过滤算子中,函数返回为false,就会被过滤掉,函数返回为true,就会被保留下来。
- 使用正则表达式。/\d/
// 1.读入文件
// 2.开始过滤,对每一行数据进行分析
// (1)字段拆分,拆分出年龄这个字段
// (2)判断
// ①如果它不是数字或者缺失,则忽略这条数据
// ②否则保存
// 3.保存过滤之后的文件
import org.apache.spark.{SparkConf, SparkContext}
object DataCleaning {
def main(args: Array[String]): Unit = {
// 创建 SparkConf 对象
val conf = new SparkConf().setAppName("DataCleaning").setMaster("local[*]")
// 创建 SparkContext 对象
val sc = new SparkContext(conf)
// 读取文本文件,创建 RDD
val inputFile = "input/file.txt"
val lines = sc.textFile(inputFile)
// 数据清洗操作
val cleanedLines = lines.filter(line => { // 使用filter算子
val fields = line.split(",")
if (fields.length == 3) {
val age = fields(1).trim
age.matches("\\d+")
} else {
false
}
})
// 输出清洗后的数据
cleanedLines.collect().foreach(println)
// 停止 SparkContext
sc.stop()
}
}
这里介绍一个拓展点:如何把清洗之后的数据保存到一个文件中。
可以使用coalesce(1)这个方法可以让结果全部保存在一个文件中
val singlePartitionRDD = cleanedLines.coalesce(1)
// 保存清洗后的数据到文件
val outputPath = "path/to/your/output/file.txt"
singlePartitionRDD.saveAsTextFile(outputPath)
// 停止 SparkContext
sc.stop()