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
下就仅有一个文件了。