Amazon Athena 如何管理列的重命名?

How does Amazon Athena manage rename of columns?

各位!

我正在开发一个解决方案,打算使用 Amazon Athena 从 S3 上的 Parquet 文件中 运行 SQL 进行查询。 这些文件将从 PostgreSQL 数据库 (RDS) 生成。我将 运行 使用 Python 的 Pyarrow 查询并将数据导出到 S3。

我的问题是:由于 Athena 是读取模式,因此在数据库中添加或删除列不会有问题...但是当我在数据库中重命名列时会发生什么?

第 1 天:专栏['col_a'、'col_b'、'col_c']

第 2 天:专栏['col_a'、'col_beta'、'col_c']

关于雅典娜,

SELECT col_beta FROM table;

return 只有第 2 天的数据,对吗? 有没有办法让 Athena 知道这些架构演变,或者我必须 运行 一个脚本来遍历我在 S3 上的所有文件,重命名列并从 'col_a' 更新 Athena 上的 table 架构到 'col_beta'?

AWS Glue 数据目录能否以任何方式帮助解决这个问题?

我很乐意对此进行更多讨论!

您可以为 AWS Glue 爬虫设置基于 'On Demand' 或 'Time Based' 的粒度,这样每次您在 S3 上的数据更新时都会生成一个新的模式(您可以编辑模式关于属性的数据类型)。这样您的列将保持更新,您可以查询新字段。

因为 AWS Athena 以架构中的“列顺序”读取 CSV 和 TSV 中的数据,并且 returns 它们以相同的顺序读取。它不使用列名将数据映射到列,这就是为什么您可以在不破坏 Athena 查询的情况下重命名 CSV 或 TSV 中的列的原因。

我建议阅读更多有关使用 Athena 处理架构更新的信息 here。通常 Athena 支持多种方式读取 Parquet 文件(以及其他列式数据格式,例如 ORC)。默认情况下,使用 Parquet,列将按名称读取,但您也可以将其更改为按索引读取。每种方式在处理模式更改时都有自己的优点/缺点。根据您的示例,如果您确定新列仅附加到末尾,您可能需要考虑按索引阅读。

Glue 爬虫可以帮助您保持架构更新(和版本控制),但它不一定能帮助您解决架构更改(逻辑上)。当然,它需要额外付费。

另一种方法可能是使用一个模式,该模式是随时间变化的所有模式的超集(按名称使用列),并在其之上定义一个视图以“手动”解决更改。