如何将Spark write.parquet生成的多个HDFS Parquet文件合并为单个文件
Spark Parquet多文件处理问题解答
一、是否可以合并为单个Parquet文件
可以合并,常用操作方式如下:
- 写入前调整数据分区:在调用
write.parquet()之前,先通过repartition(1)或者coalesce(1)将DataFrame调整为单分区,执行逻辑如下:df.repartition(1).write.parquet("/your/target/path")
其中coalesce(1)仅用于减少分区数,不会触发shuffle,性能略优。
注意:该方案仅适合中小数据量场景。如果你的数据集规模很大,单分区写入会导致对应执行节点负载过高,甚至出现内存溢出任务失败的问题,生产环境大数据量场景不推荐强制合并为单文件。 - 已生成多文件的合并:如果已经生成了多份Parquet文件,不要直接用Hadoop文件拼接类命令合并,会破坏Parquet的结构化存储格式导致文件不可读,建议先将全量多文件读取为DataFrame后,再按上述单分区写入的方式重新输出。
二、是否必须使用通配符路径读取文件
不需要。Spark原生支持直接读取完整文件夹下的所有合法Parquet文件,无需添加/*通配符,直接传入父文件夹路径即可:val df = spark.read.parquet("/folder")
如果你写入时使用了partitionBy分区规则,直接读取父路径还可以自动识别分区字段,将其作为DataFrame的常规列使用。通配符写法只是可选的路径匹配方式,并非强制要求。
内容的提问来源于stack exchange,提问作者TkrA
相关产品推荐
相关产品推荐

