0

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

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

有没有解决的办法?

谢谢。

4

1 回答 1

1

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 存储桶中的数据时,那么您可以尝试组合视图、表并保留不同版本的数据

假设您在s3://my-data-bucket/v1/位置table_v1查询数据。您创建一个视图,可以将其视为某种包装器:table_v1

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

现在您的用户可以使用my_tables3 ://my-data-bucket/v1/而不是table_v1. 当您想要更新数据时,您可以简单地将其上传到s3://my-data-bucket/v2/并定义 table table_v2。接下来,您需要更新您的my_table_view视图,因为所有查询都针对它运行:

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

完成此操作后,您可以table_v1s3://my-data-bucket/v1/. 假设数据模式没有改变,所有针对my_table_view视图运行的查询都应该在被替换table_v1后仍然有效并且成功。my_table_view

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

于 2019-09-18T09:34:08.603 回答