apache-spark - Parquet 文件:达到最小体积的最佳文件数是多少
问题描述
我已经使用在 HDFS 上具有 100 个子目录(每个子目录包含一个文件)的 spark 将数据帧写入镶木地板文件。这个文件有 100GB 。
当我将数据帧重新分区到 10 个分区并将其写入 HDFS 时,输出 parquet 文件的大小增加到大约 200GB。为什么会这样?写入镶木地板文件时的最佳分区数是多少?
我的问题与这个问题不同,我认为这不是重复的。这个问题可能会回答我问题的第一部分,虽然这不一样(为什么会发生这种情况?)但我的主要问题是:写入镶木地板文件时的最佳分区数是多少?
解决方案
这一切都归结为使用。它有两种风格,我的数据中有一个逻辑标识符,将被搜索以供使用,或者我只关心文件效率。
(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)
在不知道您的数据的情况下,我无法告诉您按逻辑标识、字节大小或两者的组合进行分区是否更好。我希望我给了你足够的信息来帮助你弄清楚你想做什么。
推荐阅读
- javascript - 如何在具有更多参数的函数中使用 e.preventDefault()?
- python - 如何在 Python 中实现以下 C 代码?(typedef、枚举和开关)
- node.js - Node 原生插件,依赖 V8
- android - CustomSeekBar 具有渐变的 alpha 颜色渐变、黑色细边框和平铺背景
- git - 如何拉不同的远程分支并合并冲突
- python - discord.py REWRITE 中的 bot 命令,如何根据角色包含和角色不包含进行条件分支?
- javascript - 在 jQuery attr 中为 data-original-title 添加样式
- .net-core - Coverlet 不会破坏 CircleCI
- postgresql - 如何在 Loopback v3 中通过 SSL 连接到 Postgres
- keras - vgg16 模型不收敛