amazon-web-services - 更新 AWS Athena 数据和表以重命名列

标签 amazon-web-services amazon-athena

今天,我遇到了一个简单的问题,将 Athena 粘合表的列从 重命名为 名称。

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

我发布这个问题的目的是为了分享,同时也是为了了解其他人是如何做的,也许会发现我重新发明了轮子。因此,如果您知道该怎么做,也请分享您的方法。

我的设置是,一个按天分区的 Athena JSON 表,其中包含大量有值(value)的数据,基础设施通过 Cloudformation 定义和更新。

如何重命名 Athena 列并仍然保留数据?

最佳答案

在没有所有 cloudformation 基础设施的情况下进行解释。

假设一个表包含:

  • 用户名
  • 得分
  • 其他列
  • eventDateUtc
  • dt_utc

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

请记住,虽然我没有测试过其他格式/配置,但这应该适用于 athena 支持的任何配置,因为我们将使用 athena 算法为我们完成这项工作。

怎么做

if you run the cloudformation migration first, you gonna "lose" access to the dropped column.
but you can simply rename the column back and the data appears.

这些是重命名 AWS Athena 表所需的步骤:

  1. 创建一个将旧列名映射到新列名的临时表:
    这可以通过使用 CREATE TABLE AS 来完成,read more in the aws docs
    使用此命令,我们使用 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 来应用数据库重命名。
    此时,您甚至可以删除 original_table,并使用正确的列名重新创建。
    重命名后,您会发现重命名后的列没有数据。

  2. 通过删除它的 s3 源来删除原始表的数据。

  3. 将临时表源中的数据复制到原始表源
    我更喜欢使用 aws 命令,因为可以复制数千个文件

aws s3 cp s3://bucket_name/A_folder/temp_table_rename/s3://bucket_name/A_folder/original_table/--递归

  1. 恢复原表索引 MSCK 修复表 "my_database"."original_table"

完成。

最后的说明:

使用 CREATE TABLE AS 做转换工作,让你做的不仅仅是重命名列,例如将列的数据拆分成 2 个新列,或者将它合并到一个一个人。

关于amazon-web-services - 更新 AWS Athena 数据和表以重命名列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64768376/

相关文章:

sql - 无法应用于 Athena 中的 bigint、varchar

hadoop - Athena 无法使用 LazySimpleSerDe 解析集合

amazon-web-services - AWS DMS : How to handle TIMESTAMP_MICROS parquet fields in Presto/Athena

amazon-web-services - 重置 SQS MessageRetentionPeriod 属性不起作用

mysql - 无法在没有维护时间的情况下创建同步的新 AWS RDS(mysql) 副本

mysql - 我如何知道 Amazon RDS 中 MySQL 数据库快照的原始大小?

presto - 在 Athena/presto 中取消嵌套映射值作为单独的列

python - 无法使用 athena 数据库连接到超集

amazon-web-services - 如何将现货实例与亚马逊 Elastic Beanstalk 一起使用?

amazon-web-services - 在 Amazon Web Services 控制台上上传 lambda 函数代码时出现问题