如果查询不基于分区进行筛选,分区在 Amazon Athena 中是否有用?

Is partitioning helpful in Amazon Athena if query doesn't filter based on partition?

我有大量数据,但没有我想根据的特定列进行过滤(也就是说,我的 'where clause' 可以是任何列)。在这种情况下,当查询最终扫描所有数据时,分区是否提供任何好处(可能有助于读取并行性?)?

如果没有列 all 或 most,查询将过滤然后分区只会损害性能。相反,目标是 100 MB 左右的文件,尽可能少,如果可能的话,Parquet,并将所有文件直接放在 table 的 LOCATION.

分区会影响性能的原因是,当 Athena 开始执行您的查询时,它会列出所有文件,其执行方式就好像 S3 是一个文件系统一样。它首先列出 table 的 LOCATION,如果它找到任何看起来像目录的东西,它将单独列出它,依此类推,递归。如果你有一个很深的目录结构,这最终会花费很多时间。您想通过将所有文件都放在一个平面结构中来帮助 Athena,但也希望少于 1000 个文件,因为这是 S3 列表操作的页面大小。对于超过 1000 个文件,您希望拥有目录,以便 Athena 可以并行化列表(但仍然尽可能少,因为并行执行的列表数量是有限的)。

您希望将文件大小保持在 100 MB 左右,因为这是一个很好的大小,可以权衡处理文件所需的时间与从 S3 获取文件的开销。 The exact recommendation is 128 MB.