package cn.ac.iie.log
import org.apache.spark.sql.{SaveMode, SparkSession}
/**
* 使用Spark完成我们的数据清洗操作
*/
object SparkStatCleanJob {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("SparkStatCleanJob").master("local[2]").getOrCreate()
val acessRDD = spark.sparkContext.textFile("file:///E:/test/output/part-00000")
// acessRDD.take(10).foreach(println)
// RDD => DF
val accessDF = spark.createDataFrame(acessRDD.map(x => AccessConvertUtil.parseLog(x)), AccessConvertUtil.struct)
// accessDF.printSchema()
// accessDF.show(false)
accessDF.coalesce(1).write.format("parquet").mode(SaveMode.Overwrite).partitionBy("day").save("file:///E:/test/clean")
spark.stop()
}
}
有时我们要将DataFrame保存到文件系统中,并且按照day字段进行partitionBy,往往使用accessDF.write.format("parquet").mode(SaveMode.Overwrite).partitionBy("day").save("file:///E:/test/clean")这种方式,
这句话:将DataFrame数据以parquet文件格式写入file:///E:/test/clean文件系统中,并且按照day进行partition,同时如果文件夹存在则进行覆盖。
但是有时候,输出的结果中day文件夹下的小文件太多了,非常影响性能。因此使用coalesce(1)来将小文件文件输出到一个文件中。之前在一个day下会有多个文件,使用accessDF.coalesce(1).write.format("parquet").mode(SaveMode.Overwrite).partitionBy("day").save("file:///E:/test/clean")方式之后,一个day下就仅有一个文件了。
本文介绍如何使用Spark进行数据清洗,特别关注DataFrame的处理及优化技巧。通过将数据转换为DataFrame并利用AccessConvertUtil解析,最终以Parquet格式保存至文件系统。文中详细解释了如何通过coalesce减少文件数量,提高读取效率。
416

被折叠的 条评论
为什么被折叠?



