AWS Athena、Parquet 和谓词下推
AWS Athena, Parquet and predicate pushdown
我想了解分区和谓词下推之间的关系。假设我们正在使用 AWS Athena 处理以 Parquet 格式存储在 S3 中的数据。数据集按 date
和 type
列分区。它还包含一个 subtype
列,如果 type
等于 X,则该列始终为 NULL。
我正在尝试执行下面的查询
SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND subtype IS NOT NULL;
查询扫描的数据量与
相同
SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL;
然而,后一个查询明显更快 (ca.30%)
我想了解幕后发生的事情。我的猜测是,在第二种情况下,执行程序只扫描给定类型和日期的分区,而在第一种情况下,它会尝试扫描所有满足日期要求的文件,而不管它们的类型。尽管这需要更多时间,因为跳过了具有 NULL 子类型的记录,但实际查询成本是相同的。
如果有人可以验证我的猜测,如果有误,请更正,将不胜感激。
您提到数据在 date
和 type
上分区。
在 WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL
种查询中,Presto (Athena) 将只需要访问相关文件。
在 WHERE date = '01012001' AND subtype IS NOT NULL
类型的查询中,Presto 将访问给定 date
的所有文件(对于所有 type
值)。由于存储在 Parquet 文件的元数据中的信息,可以跳过不包含 subtype
的非 NULL
值的文件。但是,获取元数据仍然需要时间,因为访问存储 (S3) 时存在延迟。
我想了解分区和谓词下推之间的关系。假设我们正在使用 AWS Athena 处理以 Parquet 格式存储在 S3 中的数据。数据集按 date
和 type
列分区。它还包含一个 subtype
列,如果 type
等于 X,则该列始终为 NULL。
我正在尝试执行下面的查询
SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND subtype IS NOT NULL;
查询扫描的数据量与
相同SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL;
然而,后一个查询明显更快 (ca.30%)
我想了解幕后发生的事情。我的猜测是,在第二种情况下,执行程序只扫描给定类型和日期的分区,而在第一种情况下,它会尝试扫描所有满足日期要求的文件,而不管它们的类型。尽管这需要更多时间,因为跳过了具有 NULL 子类型的记录,但实际查询成本是相同的。
如果有人可以验证我的猜测,如果有误,请更正,将不胜感激。
您提到数据在 date
和 type
上分区。
在 WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL
种查询中,Presto (Athena) 将只需要访问相关文件。
在 WHERE date = '01012001' AND subtype IS NOT NULL
类型的查询中,Presto 将访问给定 date
的所有文件(对于所有 type
值)。由于存储在 Parquet 文件的元数据中的信息,可以跳过不包含 subtype
的非 NULL
值的文件。但是,获取元数据仍然需要时间,因为访问存储 (S3) 时存在延迟。