如何使用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
相关产品推荐
相关产品推荐

