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



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

如果没有全部或大多数列,查询将对其进行筛选,则分区只会损害性能。相反,目标是 100 MB 左右的文件,尽可能少,如果可能的话,使用 Parquet,并将所有文件直接放在表的LOCATION下。

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

您希望将文件大小保持在 100 MB 左右,因为这是一个很好的大小,可以在处理文件所需的时间与从 S3 获取文件的开销之间进行权衡。确切的建议是 128 MB。

最新更新