问题描述
今天,我发现自己遇到了一个简单的问题,将雅典娜胶水表的列从旧重命名为新名称。
首先,我在这里搜索并尝试了诸如this,this之类的一些解决方案。不幸的是,没有一个有效,所以我决定使用我的知识和想象力。
我发布此问题的目的是分享,但也希望了解其他人的工作方式,也许我发现自己发明了轮子。因此,如果您知道该怎么做,也请分享一下自己的方式。
我的设置是,按天划分的Athena JSON表中包含有价值的大量数据,基础架构是通过Cloudformation定义和更新的。
如何重命名Athena列并仍然保留数据?
解决方法
在没有所有clodformation基础结构的情况下进行解释。
想象一个包含以下内容的表
- userId
- 得分
- otherColumns
- eventDateUtc
- dt_utc
由dt_utc分区并使用JSON格式存储。 Wee需要将列分数更改为deltaScore。
请记住,尽管我还没有使用其他格式/配置进行过测试,但这应该适用于athena支持的任何配置,因为我们将使用athena算法为我们完成工作。
怎么做
如果您首先运行cloudformation迁移,则将“失去”对已删除列的访问权限。
但是您只需将列重命名为后,数据就会出现。
这些是重命名AWS Athena表所需的步骤:
- 创建一个将旧列名映射到新列的临时表:
这可以通过使用 CREATE TABLE AS (创建表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/ --recursive
- 还原原始表的索引
MSCK REPAIR TABLE "my_database"."original_table"
完成。
最后的笔记:
使用CREATE TABLE AS
来完成转换工作,不仅可以重命名该列,还可以执行更多操作,例如fox示例将一列的数据拆分为2个新列,或者将其合并为一个列。