SparkSQL 控制文件输出的大小

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值