Ric*_*ois 1 sql amazon-web-services database-partitioning sql-insert amazon-athena
我目前正在使用Athena 命令通过自动化作业更新按每天INSERT INTO分区的表。execution_date
我现在想通过每天更新表两次来配置此作业,但仍按execution_date. 因此,我早上的作业运行应该像往常一样工作,但是我下午的作业运行同样应该覆盖早上execution_date同样按同样分区的记录。execution_date
我已经研究过MSCK REPAIR TABLE,但不确定它如何适合我的用例。
如何使用 Athena 的INSERT INTO命令覆盖按相同值分区的记录?
Athena 永远不会覆盖数据。如果您想删除或替换数据,您必须自行操作。INSERT INTO如果CREATE TABLE AS输出位置有任何东西,(CTAS) 将拒绝运行。
您可以做什么取决于您的要求。最简单的方法是在运行命令之前删除数据INSERT INTO。这样做的缺点是在命令运行之前分区中不会有数据。即在同一时间窗口中运行的查询将不会看到当天的任何数据。您可以确保在重新处理期间不运行任何查询并避免不一致,但如果这不是一个选项,那么它会变得更加复杂。
我过去采用的另一种方法是使用 CTAS 作为转换机制,然后将转换后的数据移动到位。有了新UNLOAD功能,这变得更容易一些,因为没有创建表。您可以做的是运行UNLOAD命令而不是运行命令INSERT INTO并使用临时输出位置。如果这是当天的第一次运行,您只需将文件复制到正确的位置并使用 Glue 数据目录 API \xe2\x80\x93\xc2\xa0创建分区,或者更好地使用分区投影来避免处理完全有分区。如果这是当天的第二次运行,则删除现有分区中的文件并将新文件复制到其位置。然后删除命令输出位置中的所有内容UNLOAD。
当分区中没有数据时以及当分区中存在部分数据时,该替代方案仍然具有较短的时间窗口。查询可以在您开始删除旧文件和将所有新文件复制到分区位置之前的任何时间点运行。该窗口最多不应超过几秒钟,特别是如果您并行执行所有删除操作,然后并行执行所有复制操作,但它永远不会为零。
\n如果您确实想避免不一致,还有另一种替代方案,它利用分区位置不必与分区键值相对应的事实。您可以运行UNLOAD与以前相同的命令,但设置输出位置,以便输出最终位于与其他分区相同的位置,但具有唯一的后缀。如果您的表按日期分区,并且您的分区具有类似 URI,s3://example-bucket/data/2021-08-16/并且s3://example-bucket/data/2021-08-17/您将命令的输出位置设置UNLOAD为类似 URI s3://example-bucket/data/2021-08-17_asdf1234/,其中“asdf1234”是每次运行的新随机字符串。转换完成后,您可以使用 Glue 数据目录 API 更新分区的位置以指向新位置,但使用相同的分区键值,例如“2021-08-17”。更新分区位置后,您将删除旧位置中的文件。这将确保运行的任何查询都将看到旧数据或新数据,但绝不会看到任何数据或部分数据。
没有办法让 Athena 自动替换分区。哪种替代方案适合您取决于查询在更新期间看不到数据或看到部分数据的问题有多严重。
\n| 归档时间: |
|
| 查看次数: |
6936 次 |
| 最近记录: |