могу ли я многораздельный s3 - PullRequest
0 голосов
/ 07 июня 2018

У меня есть эти данные, которые были установлены кем-то еще на S3…

Данные - это данные посетителей… со столбцами, такими как VisitorId, Partner, Date и т. Д. *

Данные разбиты на разделыпо дням (люди, которым он принадлежит, опрашивают в основном по дате)… Но я тоже хотел запросить это у Афины, и большинство моих запросов, как правило, группируются по VisitorId, поэтому я буду запрашивать / сканировать каждый день, год, месяц…

Мои вопросы:

  • Мне сказали, что я не могу / не должен запрашивать что-либо кроме даты, я имею в виду, что у меня должно быть «дата» в «где»предложение… верно ли это?
  • Можно ли индексировать по VisitorId (как если бы это был некластеризованный индекс на сервере sql).
  • Является ли моя единственная возможность загружать данные заново,но на этот раз разделен ли VisitorId?

Обратите внимание, что данные, как они теперь разделены по дням, хорошо подходят для людей, использующих их сейчас ... Мне просто понадобились те же данные, но я хочу запроситьэто по-другому ...

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Добавляя к ответу @Джона Ротенштейна,

Мне сказали, что я не могу / не должен запрашивать что-либо кроме даты, я имею в виду, что у меня должно быть '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» Руководство пользователя »Работа с источникомДанные »Данные разбиения

0 голосов
/ 07 июня 2018

Поскольку данные разбиты по дате, тогда запросы, использующие WHERE date BETWEEN xxx, будут очень эффективными, потому что нужно читать только некоторые каталоги.

Однако вы все равно можете запросить по VisitorId или как угодноты хочешь.Просто Афина должна будет сканировать все разделы, чтобы найти данные.

Вы не можете "индексировать" столбцы.Для такого типа хранилища данных такого понятия не существует.

Если вы собираетесь выполнять много запросов, я бы порекомендовал преобразовать его в формат Parquet.Это обеспечит очень эффективные (и более дешевые) запросы.Стоимость хранения данных дважды (в разных форматах) будет минимальной по сравнению с экономией затрат при выполнении запросов Amazon Athena над плоскими данными.

См .:

...