Как сделать базовую агрегацию с DynamoDB?

Как достигается агрегация с помощью dynamodb? Mongodb и couchbase имеют поддержку уменьшения карты.

Допустим, мы строим технический блог, где пользователи могут публиковать статьи. И сказать, статьи могут быть помечены.

user
{
    id : 1235,
    name : "John",
    ...
}

article
{
    id : 789,
    title: "dynamodb use cases",
    author : 12345 //userid
    tags : ["dynamodb","aws","nosql","document database"]
}

В пользовательском интерфейсе мы хотим показать текущие пользовательские теги и соответствующий счет.

Как достичь следующей агрегации?

{
    userid : 12,
    tag_stats:{
        "dynamodb" : 3,
        "nosql" : 8
    }
}

Мы предоставим эти данные через rest api, и это будет часто вызываться. Как эта информация показана на главной странице приложения.

  • Я могу думать об извлечении всех документов и выполнении агрегации на уровне приложения. Но я чувствую, что мои читаемые единицы мощности будут исчерпаны.
  • Можно использовать такие инструменты, как EMR, redshift, bigquery, aws lambda. Но я думаю, что это для целей datawarehousing.

Я хотел бы узнать другие и лучшие способы достижения того же. Как люди достигают динамических простых запросов, таких как выбрали dynamodb в качестве основного хранилища данных, учитывая затраты и время отклика.

Ответ 1

Короче говоря: "Динамо" не поддерживает это. Это не построить для этого варианта использования. Он предназначен для быстрого доступа к данным с низкой задержкой. Он просто не поддерживает агрегирование.

У вас есть три основных варианта:

  • Экспорт данных DynamoDB в Redshift или EMR Hive. Затем вы можете выполнять SQL-запросы на устаревших данных. Преимущество этого подхода состоит в том, что он использует RCU только один раз, но вы будете придерживаться устаревших данных.

  • Используйте разъем DynamoDB для Hive и напрямую запрашивайте DynamoDB. Опять же, вы можете писать произвольные SQL-запросы, но в этом случае он будет обращаться к данным в DynamoDB напрямую. Недостатком является то, что он потребляет емкость чтения при каждом запросе.

  • Храните агрегированные данные в отдельной таблице, используя потоки DynamoDB. Например, у вас может быть таблица UserId в качестве ключа раздела и вложенная карта с тегами и счетчиками в качестве атрибута. При каждом обновлении ваших исходных данных потоки DynamoDB будут выполнять функцию Lambda или некоторый код на ваших хостах для обновления таблицы агрегирования. Это наиболее экономически эффективный метод, но вам потребуется реализовать дополнительный код для каждого нового запроса.

Конечно, вы можете извлекать данные на уровне приложения и агрегировать их там, но я бы не рекомендовал это делать. Если у вас нет небольшого стола, вам придется подумать о регулировании, используя только часть выделенной мощности (вы хотите использовать, скажем, 20% ваших RCU для агрегации, а не 100%), и как распределить свою работу между несколькими работниками,

И Redshift, и Hive уже знают, как это сделать. Redshift опирается на несколько рабочих узлов при выполнении запроса, в то время как Hive основан на Map-Reduce. Кроме того, Redshift и Hive могут использовать предопределенный процент пропускной способности вашего RCU.

Ответ 2

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

Вам нужно будет экспортировать ваши данные в хранилище данных. Вы можете экспортировать его в S3 через экспортер DynamoDB-Glue-S3 https://aws.amazon.com/about-aws/whats-new/2018/07/aws-glue-now-supports-reading-from-amazon- таблицы динамод /. А затем используйте AWS Athena для выдачи стандартных SQL-запросов, чтобы объединиться. Когда я попробовал это, я обнаружил, что запросы SQL иногда медлительны для возврата данных, особенно когда агрегации сложны или когда размер данных велик.

Альтернативой является подключение Rockset к вашей таблице DynamoDB. Я нашел этот сценарий использования, описывающий анализ криптовалюты Decore, очень похожим на ваши требования https://rockset.com/blog/case-study-decore-uses-rockset-for-search-and-analytics-on-dynamodb/. Этот пример показывает, как SQL-запросы на Rockset были быстрыми и выполнялись в течение нескольких сотен миллисекунд.