Spark输出parquet文件时如何自定义文件名去除扩展名
解决方案
Spark没有提供直接一键关闭输出文件扩展名的公共配置项,但可以通过以下两种原生方式实现写入时直接生成无后缀文件,无需事后批量重命名:
方案1:修改Parquet输出配置(适用Spark 2.4+版本)
写入时新增两个Hadoop配置项,直接将输出扩展名设为空即可:
df.write .partitionBy("date") // 禁用通用输出扩展名 .option("mapreduce.output.fileoutputformat.outputextension", "") // 禁用Parquet专属扩展名 .option("parquet.output.extension", "") .parquet(some_path)
PySpark写法参数完全一致,无需调整。
注意:如果你的Spark版本低于2.4,需要将第一个配置替换为
mapred.output.extension即可生效。
方案2:自定义ParquetOutputFormat(兼容所有Spark版本,最可靠)
如果方案1因为集群Hadoop版本兼容问题不生效,可以自定义ParquetOutputFormat的子类,重写扩展名返回逻辑:
- 自定义Scala/Java类:
import org.apache.parquet.hadoop.ParquetOutputFormat class NoSuffixParquetOutputFormat[T] extends ParquetOutputFormat[T] { // 直接返回空字符串作为扩展名 override def getDefaultExtension: String = "" }
- 写入时通过RDD的Hadoop输出接口调用自定义格式:
// 先设置Parquet相关的写入配置 val hadoopConf = df.sparkSession.sparkContext.hadoopConfiguration ParquetOutputFormat.setCompression(hadoopConf, CompressionCodecName.SNAPPY) ParquetOutputFormat.setWriteSupportClass(hadoopConf, classOf[RowWriteSupport]) // 保存文件 df.rdd.saveAsNewAPIHadoopFile( some_path, classOf[Void], classOf[Row], classOf[NoSuffixParquetOutputFormat[Row]], hadoopConf )
生成的文件路径格式为some/path/date=2021-01-01/part-00000-77dd02e8-1a67-4f0d-9c07-b55b4f2e5efc-c000,完全没有任何扩展名。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

