我已经开始测试AWS Athena,到目前为止看起来还不错。我遇到的一个问题是有关表中数据的更新。
这里是场景:为了更新表中给定日期的数据,我基本上是清空包含CSV文件的S3存储桶,并上载新文件以成为更新的数据源。但是,存储桶为空的时间段(即删除旧源并上传新源时)实际上是一个瓶颈,因为在此间隔内,查询表的任何人都不会获得结果。
有没有办法解决这个问题?
谢谢。
答案 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
如果您的情况是需要在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
之后成功。
我不知道替换视图的停机时间是多少,但是我希望它可以少于一秒钟,这肯定比上传新文件所需的时间短。