(一)需求说明
假设你有一个包含用户信息的文本文件,每行格式为 姓名,年龄,性别,需要清洗掉年龄为空或者非数字的行。
以下是 10 条符合上述示例中数据格式(姓名,年龄,性别)的测试数据,包含了一些可能需要清洗掉的无效数据,你可以将其保存为一个文本文件,用于测试上面的数据清洗程序。
张三,25,男
王五,30,男
李四,28,女
赵六,a,男
刘七,32,女
陈八,29,男
孙九,55,女
这里面:“赵六”的年龄不是有效的数字,在执行数据清洗程序时,这些行应该会被过滤掉。
(二)思路分析
读入文件
对每一行数据进行分析
字段拆分,拆分出年龄这个字段
判断
如果它不是数字或者缺失,则忽略这条数据
否则保存
(三)难点突破
读入txt文件。 val lines = sc.textFile(inputFile)
对拆分出一行中的年龄。val fields = line.split(",") fields(0)
过滤算子中,函数返回为false,就会被过滤掉,函数返回为true,就会被保留下来。
使用正则表达式。/\d/
(四)功能实现
创建新的maven项目。
创建input文件夹,在input下新建记事本文件,内容就是前面的实例数据。
在src下创建新的scala文件,开始写功能代码。
// 1.读入文件
// 2.开始过滤,对每一行数据进行分析
// (1)字段拆分,拆分出年龄这个字段
// (2)判断
// ①如果它不是数字或者缺失,则忽略这条数据
// ②否则保存
// 3.保存过滤之后的文件
(五)参考代码
import org.apache.spark.{SparkConf, SparkContext}
object DataFilter {
//1 读取数据 读入文件
//2 对于文件的每一行
//3 将每一行数据解析成对象 分析年龄 判断数字 是就保留
//4 对象进行过滤 保存到文件
def main(args: Array[String]): Unit = {
val conf= new SparkConf().setAppName("DataFilter").setMaster("local[*]")
val sc = new SparkContext(conf)
val rdd = sc.textFile("data/file.txt")
var rdd1=rdd.filter(line => {
val age = line.split(",")(1)
println(age)
age.matches("\\d+")
})
rdd1=rdd1.coalesce(1)
rdd1.saveAsTextFile("output")
}
}
AI写代码
Scala
运行结果如下:
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/2301_81748087/article/details/147916052