更新AWS Athena数据和表以重命名列

3

今天,我遇到了一个简单的问题:将Athena Glue表的列名从更改为

首先,我在这里搜索并尝试了一些解决方案,例如这个这个和其他很多方案。不幸的是,都没有奏效,所以我决定动用我的知识和想象力。

我发布此问题的目的是分享经验,也希望了解他人的做法,或许可以发现我是如何“重复造轮子”的。如果您知道如何解决,请分享您的方法。

我的设置是,一个按日期分区的 Athena JSON 表,包含大量有价值的数据,基础架构通过 Cloudformation 定义和更新。

如何重命名 Athena 列而又保留数据?


因为迄今为止还没有回复,所以我接受了自己的答案。如果有一天我们有其他问题,我会很乐意重新讨论这个话题。 - Nicollas Braga
1个回答

3

不使用云形成基础设施进行解释。

想象一个包含以下内容的表:

  • userId
  • score
  • otherColumns
  • eventDateUtc
  • dt_utc

按 dt_utc 分区并使用 JSON 格式存储。我们需要将列 score 更改为 deltaScore。

请注意,尽管我没有与其他格式/配置进行过测试,但此操作适用于 Athena 支持的任何配置,因为我们将使用 Athena 算法来完成工作。

如何操作

如果您首先运行云迁移,则会“丢失”对已删除列的访问权限。
但是,您可以简单地将列重命名回来,数据就会出现。

以下是重命名 AWS Athena 表所需的步骤:

  1. 创建一个临时表,将旧列名映射到新列名:
    这可以通过使用 CREATE TABLE AS 完成,在 AWS 文档中阅读更多
    通过此命令,我们使用 Athena 引擎为我们在原始表的文件上应用转换并保存到 s3://bucket_name/A_folder/temp_table_rename/
CREATE TABLE "temp_table_rename"
WITH(
  format = 'JSON',
  external_location = 's3://bucket_name/A_folder/temp_table_rename/',
  partitioned_by = ARRAY['dt_utc']
)
AS
 SELECT DISTINCT
   userid,
   score as deltascore,
   otherColumns,
   eventDateUtc,
   "dt_utc"
   FROM "my_database"."original_table"
  1. 运行具有更改的CloudFormation模板来应用数据库重命名,或采用其他方式。
    此时,您甚至可以删除原始表,然后使用正确的列名称再次创建它。
    重命名后,您会注意到重命名后的列中没有数据。

  2. 通过删除其S3源来删除原始表的数据。

  3. 从临时表源复制数据到原始表源
    我倾向于使用AWS命令,因为可能需要复制数千个文件

aws s3 cp s3://bucket_name/A_folder/temp_table_rename/ s3://bucket_name/A_folder/original_table/ --recursive

  1. 恢复原始表的索引 MSCK REPAIR TABLE "my_database"."original_table"

完成。

最后说明:

使用CREATE TABLE AS来执行转换工作,让你可以做更多事情,而不仅仅是重命名列,例如将一列的数据拆分成两个新列,或合并为一个单独的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接