为啥创建了这么多 Parquet 文件?我们可以不限制 Parquet 输出文件吗?
Posted
技术标签:
【中文标题】为啥创建了这么多 Parquet 文件?我们可以不限制 Parquet 输出文件吗?【英文标题】:Why so many Parquet files created? Can we not limit Parquet output files?为什么创建了这么多 Parquet 文件?我们可以不限制 Parquet 输出文件吗? 【发布时间】:2017-01-03 05:41:45 【问题描述】:为什么在 sparkSql 中创建了这么多 Parquet 文件?我们可以不限制 Parquet 输出文件吗?
【问题讨论】:
请更好地解释您的问题。你是如何创建文件的?请提供一个完整的最小可验证示例:***.com/help/mcve。还请解释一下您到底想做什么?为什么文件数量有问题?这里有目标号码吗?也许问题出在其他问题上(meta.stackexchange.com/questions/66377/what-is-the-xy-problem) 感谢您的回复,我有用 spark 1.6 编写的 ETL 作业,我们要存储翻译数据。我们的要求非常简单,我们想从这个 parquet 文件中搜索一个字符串(大小大约超过 200GB,snappy)。对于写作,我们使用以下代码: test.saveAsParquetFile(locationfile); Parquet 使用这种方法创建了很多文件,如果我们有很多文件,这很容易理解,所以搜索会花费一些时间,因为 IO 会增加。我们需要执行一些优化技术,以便我们的搜索能够更好地执行。 【参考方案1】:一般来说,当您写入 parquet 时,它会为每个分区写入一个(或多个取决于各种选项)文件。如果你想减少文件的数量,你可以在写入之前在数据帧上调用 coalesce。例如:
df.coalesce(20).write.parquet(filepath)
当然,如果您有多种选择(例如 partitionBy),文件的数量可能会急剧增加。
另外请注意,如果您合并到非常少的分区,这可能会变得非常慢(既是因为在分区之间复制数据,也是因为如果您合并到一个足够小的数量会降低并行度)。如果单个分区中的数据太大,也可能会出现 OOM 错误(当您合并分区时自然会变大)。
有几点需要注意:
saveAsParquetFile 自 1.4.0 版起已弃用。请改用 write.parquet(path)。 根据您的用例,在 parquet 文件中搜索特定字符串可能不是最有效的方法。【讨论】:
在使用 SparkSql 编写 parquetfile 时,谁能告诉我默认的原始组大小是多少?以上是关于为啥创建了这么多 Parquet 文件?我们可以不限制 Parquet 输出文件吗?的主要内容,如果未能解决你的问题,请参考以下文章