首页 > 解决方案 > Parquet 文件:达到最小体积的最佳文件数是多少

问题描述

我已经使用在 HDFS 上具有 100 个子目录(每个子目录包含一个文件)的 spark 将数据帧写入镶木地板文件。这个文件有 100GB 。

当我将数据帧重新分区到 10 个分区并将其写入 HDFS 时,输出 parquet 文件的大小增加到大约 200GB。为什么会这样?写入镶木地板文件时的最佳分区数是多少?

我的问题与这个问题不同,我认为这不是重复的。这个问题可能会回答我问题的第一部分,虽然这不一样(为什么会发生这种情况?)但我的主要问题是:写入镶木地板文件时的最佳分区数是多少?

标签: apache-sparkparquet

解决方案


这一切都归结为使用。它有两种风格,我的数据中有一个逻辑标识符,将被搜索以供使用,或者我只关心文件效率。

(1) 逻辑标识符,如果您的数据有一个或多个正在使用的列(即事务时间或输入时间),您可以沿着这些线划分,这将允许您的流程快速解析数据,从而加快查询时间. 分区的缺点是超过 2K 会破坏 Impala 等技术,所以不要太疯狂。

(2) 大小分区,如果您正在考虑优化文件大小以在环境和其他服务/工具中移动。我建议尝试将每个分区的数据大小设置为 128MB。这将允许在处理一系列较小文件(即 AWS S3)时可能出现问题的其他工具更快地移动。下面是一些用于根据数据大小设置分区的代码。

import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.types._ 
import org.apache.spark.sql.DataFrame 
import org.apache.spark.util.SizeEstimator 

val inputDF2 : Long = SizeEstimator.estimate(inputDF.rdd) 
//find its appropiate number of partitions 
val numPartitions : Long = (inputDF2/134217728) + 1 
//write it out with that many partitions  
val outputDF = inputDF.repartition(numPartitions.toInt) 

在不知道您的数据的情况下,我无法告诉您按逻辑标识、字节大小或两者的组合进行分区是否更好。我希望我给了你足够的信息来帮助你弄清楚你想做什么。


推荐阅读