首页 > 解决方案 > 使用数组为大数据设计 DynamoDB。超过 400k

问题描述

我正在使用node.js并记录事件时间和事件数据,我想使用 AWS DynamoDBTable。

单个数据和一键数据模式示例,如下所示。

var want_to_update_data = [ // contain json more or same than 1
  { "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
  ...
];

var saved_data = { // DynamoDB Saved Data Sample with Key "ABCD"
  "Key" : "ABCD",
  "events" : [
    ...
    { "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
    { "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
    { "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
    ...
  ]
}

上面的数据仅用于样本。json 包含更多的键值。


对于更新单个 json,我的服务器代码喜欢下。

app.get('/insert', req, res) {
  var update_key = req.body.update_key; // "ABCD"
  var want_to_update_data = req.body.update_data; // [ {} ]

  var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
  var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list

  AWS.config.update({
    region: "region",
    endpoint: "endpoint",
    accessKeyId: "access_key",
    secretAccessKey: "secret_key",
  });

  var params = {
    TableName: "TableName",
    Key: update_key,
    UpdateExpression: updateExpression,
    ExpressionAttributeValues: expressionAttributeValues,
    ReturnValues: "UPDATED_NEW"
  });

  var dynamodbClient = new AWS.DynamoDB.DocumentClient();
  dynamodbClient.update(params, function(err, data) {
    if(err) { /* handle error */ }
    else { /* handle after update complete */ }
  });
});

简单地说,它可以工作,但 AWS DynamoDB 不能一次更改超过 4kb。
因此,如果数组数据大于 4k,则 list_append 无法处理ValidationException: Item size to update has exceeded the maximum allowed size错误消息。


我想保留所有事件并想对event-time键进行排序。

如何更改我的 DynamoDB 架构?

根据代码只是我的猜测。
是否可以?

{
  "Key" : "ABCD",
  /*
  "events" : [
    ...
    { "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
    { "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
    { "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
    ...
  ]
  */
  "events" : { // is it possible events['some-date'] could be sort-key?
    ...
    "2020-12-28 09:30:17" : 35,
    "2021-01-01 19:11:12" : 16,
    "2021-01-02 10:11:12" : 19,
    ...
  }

}

/*
  var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
  var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list
*/

  // under 2 line is just for sample. json key is not fixed
  var event_time = '2021-01-02 10:11:12';
  var single_json = want_to_update_data[event_time];

  // if number-start key is not allow(event_time), prefix append could be like "D_2021~~"
  var updateExpression = `SET events.${event_time} = :dl`;
  var expressionAttributeValues = {':dl' : single_json }; // single json

感谢您阅读我的问题。

我想创建新表来保存我的事件 json 数据。(不是 S3。使用 DynamoDB)

标签: node.jsamazon-dynamodb

解决方案


DynamoDB 的项目大小限制为 400kb,包括属性名称。

根据文档

List、Map 或 Set 中的值数量 List、Map 或 Set 中的值数量没有限制,只要包含值的项目符合 400 KB 项目大小限制即可。

听起来您的 4k 事件列表,加上您在项目中保存的任何其他内容,都超过了这个 400kb 限制。您可以查看这个漂亮的计算器来了解您的物品的大小。

您可能希望将它们存储在项目集合中,而不是将事件存储在列表项中。

例如,而不是这个:

在此处输入图像描述

您可以像这样存储事件数据

在此处输入图像描述

如果您需要按时间获取事件,您可以考虑使用event_time排序键。

在此处输入图像描述


推荐阅读