You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AWS CLI拉取DynamoDB表的全量数据?

全量拉取DynamoDB表数据的解决方案

你当前执行的单次scan命令最多只能返回1MB数据,因此得到的output.json仅包含部分表数据,要拉取全量数据可参考以下两种方案:


方法1:使用AWS CLI直接拉取

  • 如果你使用的是AWS CLI v2,默认已支持自动处理分页逻辑,无需额外参数即可拉取全量数据,直接执行命令即可:
    aws dynamodb scan --table-name my_table_name > full_output.json
    
  • 如果你使用的是AWS CLI v1,不会自动处理分页,可以使用以下shell脚本循环拉取(依赖jq工具):
    #!/bin/bash
    TABLE_NAME="my_table_name"
    OUTPUT_FILE="full_output.json"
    LAST_EVALUATED_KEY=""
    > "$OUTPUT_FILE"
    echo "[" >> "$OUTPUT_FILE"
    FIRST_RUN=true
    
    while : ; do
      if [ -z "$LAST_EVALUATED_KEY" ]; then
        RESPONSE=$(aws dynamodb scan --table-name "$TABLE_NAME")
      else
        RESPONSE=$(aws dynamodb scan --table-name "$TABLE_NAME" --starting-token "$LAST_EVALUATED_KEY")
      fi
      # 提取当前页数据
      ITEMS=$(echo "$RESPONSE" | jq -c '.Items[]')
      if [ -n "$ITEMS" ]; then
        [ "$FIRST_RUN" = false ] && echo "," >> "$OUTPUT_FILE"
        echo "$ITEMS" | paste -sd "," >> "$OUTPUT_FILE"
        FIRST_RUN=false
      fi
      # 判断是否还有下一页
      LAST_EVALUATED_KEY=$(echo "$RESPONSE" | jq -r '.LastEvaluatedKey')
      [ "$LAST_EVALUATED_KEY" = "null" ] && break
    done
    
    echo "]" >> "$OUTPUT_FILE"
    

方法2:使用Python + Boto3拉取(适配后续转DataFrame场景)

如果你后续需要直接转DataFrame做预处理,建议直接用Python拉取,省去中间导出JSON文件的步骤,代码如下:

import boto3
import pandas as pd
from botocore.exceptions import ClientError

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('my_table_name')

scan_kwargs = {}
all_items = []

try:
    while True:
        response = table.scan(**scan_kwargs)
        all_items.extend(response.get('Items', []))
        # 存在下一页则继续拉取
        if 'LastEvaluatedKey' not in response:
            break
        scan_kwargs['ExclusiveStartKey'] = response['LastEvaluatedKey']
except ClientError as e:
    print(f"扫描表出错: {e.response['Error']['Message']}")
    raise

# 可选:将DynamoDB带类型标识的字段转为普通值,方便后续处理
def unmarshal_item(item):
    res = {}
    for k, v in item.items():
        if 'S' in v:
            res[k] = v['S']
        elif 'N' in v:
            res[k] = float(v['N']) if '.' in v['N'] else int(v['N'])
        elif 'BOOL' in v:
            res[k] = v['BOOL']
        # 其他列表、二进制等类型按需补充
    return res

unmarshalled_items = [unmarshal_item(i) for i in all_items]
df = pd.DataFrame(unmarshalled_items)

注意事项

  • 全表扫描会消耗表的读容量单位(RCU),如果是预置容量模式的表,建议在业务低峰期执行,或提前临时调高RCU避免影响线上业务
  • 如果只需要部分字段,可以在scan参数中添加ProjectionExpression指定返回字段,减少返回数据量,降低RCU消耗

内容的提问来源于stack exchange,提问作者Bushmaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:39:03