Добавляя к ответу @Джона Ротенштейна,
Мне сказали, что я не могу / не должен запрашивать что-либо кроме даты, я имею в виду, что у меня должно быть 'date' в 'where'предложение ... это правда?
Да, если вы структурируете свое ведро S3 как таковое.
s3://BUCKETNAME/date_partition=2000-01-01/
s3://BUCKETNAME/date_partition=2000-01-02/
s3://BUCKETNAME/date_partition=2000-01-03/
...
s3://BUCKETNAME/date_partition=2000-06-07/
s3://BUCKETNAME/date_partition=2000-06-08/
Затем вы прикрепляете все файлы с данными, соответствующими заданной дате, под именем и разделом.
Затем вы пишете DDL для использования этого раздела:
CREATE EXTERNAL TABLE somedatabase.sometable (
VisitorId bigint,
Partner string,
`Date` date,
...
fieldn typen
)
PARTITIONED BY (date_partition date)
ROW FORMAT ...
Как говорит @John Rotenstein, вы можете затем использовать поле date_partition
в предложении where.Обратите внимание, что я использовал другое имя, поскольку у вас не может быть двух столбцов с одинаковым именем.
Кроме того, раньше было мягкое ограничение в 20 000 разделов на таблицу Афины.Я проверил документацию и не нашел этот предел.Возможно, это было отменено?Проверяя страницу AWS Service Limits , я не увидел никаких упоминаний об ограничении количества разделов, разрешенных в таблице Athena.
Можно ли индексировать по VisitorId (как если бы это был некластеризованный индекс на сервере sql).
Да, логика будет такой же
Является ли мой единственный вариант загрузки данных заново, но на этот раз с разделением по VisitorId?
Вы можете разделить по VisitorId и дате, но вам нужно будет загрузить правильные данныев правильные разделы.
s3://BUCKETNAME/date_partition=2000-01-01/visitorid_partition=1000/
s3://BUCKETNAME/date_partition=2000-01-01/visitorid_partition=2000/
s3://BUCKETNAME/date_partition=2000-01-02/visitorid_partition=1000/
s3://BUCKETNAME/date_partition=2000-01-02/visitorid_partition=2000/
...
s3://BUCKETNAME/date_partition=2000-06-07/visitorid_partition=1000/
s3://BUCKETNAME/date_partition=2000-06-08/visitorid_partition=2000/
DDL будет записан так:
CREATE EXTERNAL TABLE somedatabase.sometable (
VisitorId bigint,
Partner string,
`Date` date,
...
fieldn typen
)
PARTITIONED BY (date_partition date, visitorid_partition bigint)
ROW FORMAT ...
Всегда помните, что сжатие и столбчатые форматы приведут к дополнительной экономии. AWS Glue может помочь с этими преобразованиями.
Дополнительные сведения:
Документация AWS »Amazon Athena» Руководство пользователя »Работа с источникомДанные »Данные разбиения