首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用INSERT INTO基于分区覆盖表?-雅典娜

如何使用INSERT INTO基于分区覆盖表?-雅典娜
EN

Stack Overflow用户
提问于 2021-08-16 18:17:52
回答 1查看 1K关注 0票数 1

我目前正在使用INSERT INTO雅典娜命令通过自动作业每天更新由execution_date分区的表。

现在,我希望通过每天更新两次表来配置此作业,但仍由execution_date进行分区。因此,我上午的作业运行应该像往常一样工作,但是我下午使用相同的execution_date运行的作业应该覆盖上午由相同的execution_date分区的记录。

我已经研究了MSCK REPAIR TABLE,但我不确定它在我的用例中是如何工作的。

如何使用雅典娜的INSERT INTO命令覆盖按相同值分区的记录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-17 08:57:23

雅典娜永远不会覆盖数据。如果你想删除或替换数据,你必须自己做。如果在输出位置有任何东西,INSERT INTOCREATE TABLE AS (CTAS)将拒绝运行。

你能做什么取决于你的需求。最简单的方法是在运行INSERT INTO命令之前删除数据。这样做的缺点是,在命令运行之前,分区中将没有数据。即,在同一时间窗口中运行的查询将看不到当天的任何数据。您可以确保在重新处理过程中不运行任何查询,从而避免不一致,但如果不能这样做,则会变得更加复杂。

我过去采用的另一种方法是使用CTAS作为转换机制,然后将转换后的数据移动到适当的位置。有了新的UNLOAD特性,这就变得更容易了,因为没有创建表。您可以做的是运行一个UNLOAD命令而不是您的INSERT INTO,并使用一个临时输出位置。如果这是一天中的第一次运行,那么您只需将文件复制到正确的位置,而create a partition using the Glue Data Catalog API - or甚至更好地使用partition projection来避免必须完全处理分区。如果这是当天的第二次运行,则删除现有分区中的文件,并将新文件复制到它们的位置。然后删除UNLOAD命令输出位置中的所有内容。

当分区中没有数据,并且分区中有部分数据时,该替代方案仍然具有较短的时间窗口。查询可以在开始删除旧文件和将所有新文件复制到分区位置之前的任何时间点运行。该窗口最多不应超过几秒,特别是如果您并行执行所有删除操作,然后并行执行所有复制操作,但它永远不会为零。

如果您确实想要避免不一致,还有另一种选择,它利用分区位置不必与分区键值相对应这一事实。您可以像以前一样运行相同的UNLOAD命令,但是要设置输出位置,以便输出在与其他分区相同的位置结束,但后缀是唯一的。如果您的表是按日期分区的,并且您的分区具有s3://example-bucket/data/2021-08-16/s3://example-bucket/data/2021-08-17/之类的URI,那么可以将UNLOAD命令的输出位置设置为s3://example-bucket/data/2021-08-17_asdf1234/之类的URI,其中"asdf1234“是每次运行的新随机字符串。一旦转换完成,你可以通过update the partition's location using the Glue Data Catalog API指向新的位置,但是对分区键使用相同的值,例如"2021-08-17“。更新分区的位置后,您可以删除旧位置中的文件。这将确保运行的任何查询要么看到旧数据,要么看到新数据,但决不会看到无数据或部分数据。

没有办法让Athena自动替换分区。哪个替代方案适合您取决于查询在更新期间看不到数据或看到部分数据的问题有多大。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68807517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档