今天,我遇到了一个简单的问题,将 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 表所需的步骤:
- 创建一个将旧列名映射到新列名的临时表:
这可以通过使用 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"
通过使用更改或按照您的方式运行 cloudformation 来应用数据库重命名。
此时,您甚至可以删除 original_table,并使用正确的列名重新创建。
重命名后,您会发现重命名后的列没有数据。通过删除它的 s3 源来删除原始表的数据。
将临时表源中的数据复制到原始表源
我更喜欢使用 aws 命令,因为可以复制数千个文件
aws s3 cp s3://bucket_name/A_folder/temp_table_rename/s3://bucket_name/A_folder/original_table/--递归
- 恢复原表索引
MSCK 修复表 "my_database"."original_table"
完成。
最后的说明:
使用 CREATE TABLE AS
做转换工作,让你做的不仅仅是重命名列,例如将列的数据拆分成 2 个新列,或者将它合并到一个一个人。
关于amazon-web-services - 更新 AWS Athena 数据和表以重命名列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64768376/