Как эффективно хранить и запрашивать данные с помощью пары ключ-значение в AWS S3 и Athena?

У меня есть набор данных, хранящийся в AWS S3, и я делаю запрос с помощью AWS Athena. В настоящее время данные структурированы в двух столбцах в S3 следующим образом:

Набор данных

Customer_ID | Products_csv
C1          | P1, P2, P3
C2          | P2, P4

При дополнительном требовании необходимо добавить еще одно поле — количество продукта, и вот как я планировал его хранить:

Customer_ID | Product:Quantity(csv)
C1          | P1:3, P2:1, P3:5
C2          | P2:2, P4:7 

Если для таблицы в athena соблюдать указанный выше формат, выполнить необходимые операции с данными будет не проще. Например, если для каждого клиента необходимо получить только продукты с количеством (>=3) (то есть P1, P3 для клиента 1 и P4 для клиента 2), запрос будет сложным с указанной выше структурой или может не масштабироваться для огромного объема данных. .

Размер данных

  1. Количество идентификаторов клиентов (в виде строк) составит несколько миллионов.
  2. Продукты могут находиться в диапазоне 0–100 для каждого идентификатора клиента.

Мы будем очень признательны за любые идеи о том, как хранить данные столбцов продуктов и количества в альтернативном формате, оптимальном для запросов.

🤔 А знаете ли вы, что...
SQL может работать с большими объемами данных благодаря оптимизации и индексам.


59
1

Ответ:

Решено

Более традиционный формат — отдельные строки для каждого отношения.

Например:

Customer_ID, Product, Quantity
C1, P1, 3
C1, P2, 1
C1, P3, 5
C2, P2, 2
C2, P4, 7

Миллионы строк — не проблема. Афине будет легче обработать более простой формат.

Вы получите гораздо лучшую производительность, если данные будут храниться в формате Parquet. Можно использовать Athena для преобразования данных в Parquet, но начните с использования CSV, чтобы убедиться, что все работает.