Как запросить количество для каждого столбца в DynamoDB - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть DynamoDB с 50 различными столбцами, помеченными как вопрос1 - вопрос 50. Каждый из этих столбцов имеет либо a, b, c, либо d в качестве ответов на вопрос с несколькими вариантами ответов. Каков наиболее эффективный способ подсчета количества людей, ответивших «а» на вопрос1?

Я пытаюсь вернуть счет a, b, c, d для ВСЕХ вопросов, поэтому я хочу посмотреть, сколько ответило a на вопрос1, сколько ответило b для вопроса 1 и т. д. Итак, в конце у меня должен быть счет для каждого вопроса и их ответа.

В настоящее время у меня есть это, но я не чувствую, что это эффективно, чтобы напечатать все. Есть ли упрощенный способ сделать это?

exports.handler = async function(event, ctx, callback) {
  const params = {
    ScanFilter: {
        'question1' : {
            ComparisonOperator: 'EQ', 
            AttributeValueList: {
                S: 'a'
            }
        }
    },
    TableName : 'app',
    Select: 'COUNT'
  };

  try {
    data = await dynamoDb.scan(params).promise()
    console.log(data)
  } 
  catch (err) {
    console.log(err);
  }
}

Ответы [ 3 ]

0 голосов
/ 07 апреля 2019

Вы пропустили упоминание двух вещей - это для вас разовая операция или вам нужно делать это регулярно? а сколько у вас записей?

Если это однократная операция:

Поскольку у вас есть 50 вопросов и 4 варианта для каждого (200 комбинаций) и предполагается, что у вас много данных, самое простое решение - экспортировать все данные в csv и создать там сводную таблицу. , Это проще, чем сканирование всей таблицы и выполнение операций агрегирования в памяти. Или вы можете экспортировать таблицу в s3 как json и использовать athena для выполнения запросов к данным.

Если вам нужно делать это регулярно, вы можете выполнить одно из следующих действий:

  • Сохраните ваши совокупные значения как GSI в той же таблице, или в новой таблице, или где-то еще целиком. Включите и отправьте потоки лямбда-функции. Увеличивайте эти значения в соответствии с поступающими новыми данными.
  • Использовать эластичный поиск - включите потоки в вашей базе данных и используйте лямбда-функцию, отправляющую их в индекс эластичного поиска. Индексировать текущие данные, а также. А затем выполните агрегированные запросы по этому индексу.
0 голосов
/ 11 мая 2019

Как упомянуто здесь https://stackoverflow.com/a/55553744/6723229, если вы хотите выполнить однократную операцию, вы можете экспортировать ее в S3 и использовать AWS Athena для выполнения запросов. Это хорошо, но дорого и требует применения схемы, если вы ожидаете, что она изменится в будущем.

Если вы хотите делать это на регулярной основе, получать больше данных и не хотите каждый раз экспортировать данные, вы можете воспользоваться такой услугой, как Rockset . Rockset имеет живую интеграцию с DynamoDB, которую можно использовать для синхронизации данных между DynamoDB и Rockset. Когда данные находятся в Rockset, вы можете использовать SQL для эффективного запроса. Rockset будет индексировать все поля и выполнять быстрые агрегации.

См. Здесь https://rockset.com/blog/running-fast-sql-on-dynamodb-tables/ о том, как это настроить.

Отказ от ответственности: я работаю в Rockset.

0 голосов
/ 05 апреля 2019

Агрегат RDBMS довольно легко ... DDB не так много.

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

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

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