【问题标题】:Best method to extract data from dynamoDb and move it to another table从 dynamoDb 中提取数据并将其移动到另一个表的最佳方法
【发布时间】:2019-09-02 07:23:58
【问题描述】:

我有一个 500GB 的表。我想根据时间戳将数据传输到另一个表。 表中有几个项目,我只想要另一个表中每个项目的最新条目。

考虑到桌子的大小,谁能推荐最好的 aws 服务来快速轻松地完成它?

我遇到了 aws 胶水、hivecopyactivity。这是最好的解决方案还是我可以使用其他任何服务?

【问题讨论】:

  • 该表的分区键和排序键(如果有)是什么? “基于时间戳”:每个项目中是否有时间戳字段?如果没有,项目的时间戳在哪里定义?您在该表上有多少个全局二级索引?
  • 还有一个问题,关于“我只想要每个项目的最新条目”。更新原始表时会发生什么(添加了具有较新时间戳的条目)。您是否也希望更新第二个表?如果是这样,那么您的应用程序可以容忍的传播延迟是多少?
  • @ItayMaman 该表将在提取期间冻结。是的,数据库中的每个条目都有时间戳。分区和排序键是不同的。我对另一列感兴趣,希望获得最新条目。
  • “最新条目”:具有相同主键的最新条目?具有相同的主键+排序键?还有什么?
  • @ItayMaman 别的。有列 x:String 既不是主键也不是排序键。我必须得到 x 的最新条目。

标签: amazon-web-services amazon-dynamodb extract etl


【解决方案1】:

(假设您现在可以在该表上添加一个全局二级索引(GSI),即:您当前有

在您的表上定义一个新的 GSI。 GSI 的分区键为x。 GSI 的排序键为timestamp。定义 GSI 后,您可以在该索引上执行 query 并将 ScanIndexForward 设置为 false 以首先获取最新项目。您需要提供您感兴趣的x 的值。在以下示例请求中,它被简单地设置为'abc'

{
    "TableName": "<your-table-name>",
    "IndexName": "<your-GSI-name>",
    "KeyConditionExpression": "x = :argx",
    "ExpressionAttributeValues": {
        ":argx": {"S": "abc"}
    },
    "ScanIndexForward": false,
    "Limit": 1
}

此查询查看具有给定 x 值(在 ExpressionAttributeValues 字段中设置)按降序排序的项目(按 GSI 的排序键,即 timestamp 字段)并选择第一个 ( Limit 设置为 1)。只要您不需要过滤FilterExpression 字段为空),那么您将通过发出单个查询请求获得所需的结果。

如果您确实想要使用过滤,则需要执行多个请求并取消设置 Limit 字段(即,使用其默认值)。有关这些微妙之处的更多详细信息,请参阅this answer

【讨论】:

  • 抱歉,我收到了一些新信息。我感兴趣的列是排序键。它会改变你的答案吗? @ItayMaman
  • “x”是排序键还是“timestamp”是排序键?
  • x 是排序键
  • 那我的答案不变
  • 现在需求变了。现在我需要考虑两列和时间戳。所以,现在我需要两列 x 和 y 的每个唯一组合的最新条目。 @ItayMaman
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2015-06-20
  • 2015-10-31
  • 1970-01-01
  • 2013-07-22
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多