SaprkSQL小文件合并
spark版本2.4.7
背景:
flink任务会产生很多小文件,影响namenode性能,需要合并小文件
核心思想:
1.读取hive数据转为DataFrame
2.DataFrame使用coalesce(1)合并为一个文件
3.创建视图,overwrite插入
代码:
/**
* 控制输出文件的个数DataFrame输出结果保存为文件时,可以控制输出文件的的个数,从而减少小文件的个数
* DataFrame.coalesce(1).write.format("parquet").mode(SaveMode.Overwrite).partitionBy("分区条件列名").save("路径")
* @param spark
* @param startdate
* @param enddate
*/
class MergeOds(spark: SparkSession, startdate: LocalDate, enddate: LocalDate) extends Serializable {
var dateLocalDate: LocalDate = null
if (startdate != null)
dateLocalDate = startdate
else
dateLocalDate = LocalDate.now().minusDays(1) //默认统计昨日
val dateString = dateLocalDate.format(DateTimeFormatter.ISO_LOCAL_DATE)
var enddateLocalDate: LocalDate = null
if (enddate != null)
enddateLocalDate = enddate
else
enddateLocalDate = LocalDate.now().minusDays(1) //默认统计昨日
val enddateString = enddateLocalDate.format(DateTimeFormatter.ISO_LOCAL_DATE)
val db = "ods"
val table = "ods_shop_original_front_point"
spark.sql(s"msck repair table $db.$table")
spark.sql(
s"""
|select * from $db.$table
|where pdate >= '$dateString'
|and pdate <= '$enddateString'
|""".stripMargin).coalesce(1).createTempView(table)
spark.sql(
s"""
|insert overwrite table $db.$table partition(pdate)
|select * from $table
|""".stripMargin)
}