AWS Athena表数据更新

时间:2019-09-17 18:35:17

标签: amazon-s3 amazon-athena pyathena

我已经开始测试AWS Athena,到目前为止看起来还不错。我遇到的一个问题是有关表中数据的更新。

这里是场景:为了更新表中给定日期的数据,我基本上是清空包含CSV文件的S3存储桶,并上载新文件以成为更新的数据源。但是,存储桶为空的时间段(即删除旧源并上传新源时)实际上是一个瓶颈,因为在此间隔内,查询表的任何人都不会获得结果。

有没有办法解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

Athena是一项Web服务,允许查询驻留在AWS S3上的数据。为了运行查询,Athena现在需要表模式以及在S3上何处查找数据。所有这些信息都存储在AWS Glue元数据目录中。从本质上讲,这意味着每次获取新数据时,只需要将新的csv文件上传到S3。

让我们假设您每天在午夜获取新数据,并将它们存储在S3存储桶中:

my-data-bucket
├── data-file-2019-01-01.csv
├── data-file-2019-01-02.csv
└── data-file-2019-01-03.csv

每个文件看起来像:

| date       | volume  | product | price |
|------------|---------|---------|-------|
| 2019-01-01 | 100     | apple   | 10    |
| 2019-01-01 | 200     | orange  | 50    |
| 2019-01-01 | 50      | cherry  | 100   |

然后将它们上传到AWS S3之后,可以使用以下DDL语句来定义表

CREATE EXTERNAL TABLE `my_table`(
  `date` timestamp, 
  `volume` int, 
  `product` string, 
  `price` double)
LOCATION
  's3://my-s3-bucket/'
-- Additional table properties

现在,当您获得一个新文件data-file-2019-01-04.csv并将其上传到其他文件所在的位置时,Athena也将能够查询新数据。

my-data-bucket
├── data-file-2019-01-01.csv
├── data-file-2019-01-02.csv
├── data-file-2019-01-03.csv
└── data-file-2019-01-04.csv

更新2019-09-19

如果您的情况是需要在S3存储桶中更新数据,则可以尝试合并views,表并保留不同版本的数据

假设您有table_v1可以查询 s3:// my-data-bucket / v1 / 位置中的数据。您为table_v1 create a view可以被视为某种包装:

CREATE VIEW `my_table_view` AS
SELECT *
FROM `table_v1`

现在,您的用户可以使用my_table而不是table_v1来查询 s3:// my-data-bucket / v1 / 中的数据。要更新数据时,只需将其上传到 s3:// my-data-bucket / v2 / 并定义表table_v2。接下来,由于所有查询都针对该视图运行,因此您需要更新my_table_view视图:

CREATE OR REPLACE VIEW `my_table_view` AS
SELECT *
FROM `table_v2`

完成此操作后,您可以删除table_v1并从s3://my-data-bucket/v1/删除文件。假设数据架构未更改,则在基于my_table_view的情况下针对table_v1视图运行的所有查询应该仍然有效,并在替换my_table_view之后成功。

我不知道替换视图的停机时间是多少,但是我希望它可以少于一秒钟,这肯定比上传新文件所需的时间短。