我已经开始测试 AWS Athena,到目前为止它看起来不错。我遇到的一个问题是关于表中数据的更新。
这是场景:为了更新表中给定日期的数据,我基本上是清空包含 CSV 文件的 S3 存储桶,并上传新文件以成为更新的数据源。但是,bucket 为空的时间段(即删除旧源并上传新源的时间)实际上是一个瓶颈,因为在此时间间隔内,任何人查询表都不会得到任何结果。
有没有解决的办法?
谢谢。
我已经开始测试 AWS Athena,到目前为止它看起来不错。我遇到的一个问题是关于表中数据的更新。
这是场景:为了更新表中给定日期的数据,我基本上是清空包含 CSV 文件的 S3 存储桶,并上传新文件以成为更新的数据源。但是,bucket 为空的时间段(即删除旧源并上传新源的时间)实际上是一个瓶颈,因为在此时间间隔内,任何人查询表都不会得到任何结果。
有没有解决的办法?
谢谢。
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
如果您的场景是当您需要更新 S3 存储桶中的数据时,那么您可以尝试组合视图、表并保留不同版本的数据
假设您在s3://my-data-bucket/v1/位置table_v1
查询数据。您创建一个视图,可以将其视为某种包装器:table_v1
CREATE VIEW `my_table_view` AS
SELECT *
FROM `table_v1`
现在您的用户可以使用my_table
s3 ://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_v1
从s3://my-data-bucket/v1/
. 假设数据模式没有改变,所有针对my_table_view
视图运行的查询都应该在被替换table_v1
后仍然有效并且成功。my_table_view
我不知道替换视图的停机时间会是多少,但我希望它少于一秒钟,这绝对比上传新文件所需的时间少。