【问题标题】:AWS Glue/Athena - S3 - Table partitioningAWS Glue/Athena - S3 - 表分区
【发布时间】:2020-09-09 20:26:03
【问题描述】:

假设我在 AWS Glue 中注册了一个外部表,该表位于 S3 中并由 Athena 查询。 最佳做法是对数据进行分区。所以在正常情况下,我有两个看似相同的选择,

1. /data/_path/yyyy/mm/dd/col1/col2/data.parquet
2. /data/_path/col1/col2/yyyy/mm/dd/data.parquet

我假设 Athena 扫描/查询的数据对于给定的 col1 和/或 col2 都是相同的。 但是哪个更受欢迎,为什么?

【问题讨论】:

  • 此问题中的信息不足,无法使答案有意义。哪种方案更好取决于col-1col-2 是什么、生成数据的过程如何工作以及您将运行什么查询。

标签: amazon-web-services parquet aws-glue amazon-athena


【解决方案1】:

首选方法是从最细粒度的变量到最细粒度的变量。

通常是第一个答案,因为您的年数少于月数,月数少于天数,天数少于 col1s,col1s 少于 col2s。

但是,如果您有任何规范要求 col1s 和 col2s 先出现,然后是几年,这将不是问题。

【讨论】:

  • +1 用于将其概括为“粒度最小的变量到最粒度的变量”,即使在 col1 和 col2 的情况下,它们也可以以相同的方式进行概括。但是当路径组件变得彼此独立时(例如 yyyy、mm、dd 独立于 col、col2),它们出现在路径中的位置或多或少取决于用例。
【解决方案2】:

如果基于yyyy/mm/dd快速生成数据,则选项#1。

例如,您在一个月内生成的数据发生在从 01 到 30(或 29,31)的每一天,因此该模式很好。

或者另一个例子,您生成的数据发生在小时级别,因此模式 yyyy/mm/dd/hh 会很棒。

如果基于col1/col2快速生成数据,则选项#2

例如,您生成的数据基于 col1 (class id)/col2 (student id) 发生变化,属于学生 id 的数据遵循 yyyy/mm/dd,因此您可以继续使用 col1/col2/yyyy/mm/dd

或者您可以考虑,如果您的用例在查询数据方面更频繁地使用 col1/col2,那么选项 #2 是一个不错的选择。

对我来说,如果我们比较 2 个选项的性能,我认为这并不重要。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2019-04-08
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2018-10-21
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多