使用AWS CLI结合jq导出DynamoDB数据到CSV时遇编码及JSON解析错误
DynamoDB导出CSV:JSON截断与编码错误解决
问题重现
执行以下命令导出DynamoDB数据到CSV时出现双重错误:
aws dynamodb scan --table-name MyTable --select ALL_ATTRIBUTES --page-size 500 --max-items 100000 --output json --profile production | jq -r '.Items' | jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ].S])[] | @csv' > export.my-table.csv
错误信息:
'charmap' codec can't encode characters in position 1-3: character maps to <undefined> parse error: Unfinished JSON term at EOF at line 5097, column 21
错误1:JSON截断(Unfinished JSON term at EOF)
原因
管道传输大体积JSON数据时,缓冲限制、分页处理不完整或网络中断都可能导致jq接收到的JSON不完整,触发解析错误;多次调用jq的管道操作也会增加数据截断风险。
解决步骤
- 先导出完整JSON到临时文件,规避管道传输的截断问题:
aws dynamodb scan --table-name MyTable --select ALL_ATTRIBUTES --page-size 500 --max-items 100000 --output json --profile production > temp_full_data.json - 用单次jq处理临时文件:
jq -r '.Items | (.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ].S])[] | @csv' temp_full_data.json > export.my-table.csv - 若目标数据量超过100000条,去掉
--max-items参数或调整为更大值,确保能获取到所有需要的数据。
错误2:编码不兼容(charmap codec can't encode characters)
原因
Windows系统默认使用GBK/CP1252编码,当CSV包含非ASCII字符(如中文、特殊符号)时,重定向输出会因编码不匹配报错;Linux/macOS极少出现,但终端编码非UTF-8时也会触发该问题。
解决步骤
- Windows PowerShell环境:
先设置终端编码为UTF-8,再执行导出命令:
或直接用$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding aws dynamodb scan ... | jq ... > export.my-table.csvOut-File指定编码:aws dynamodb scan ... | jq ... | Out-File -Encoding UTF8 export.my-table.csv - Linux/macOS环境:
确保终端编码为UTF-8,必要时执行以下命令设置:export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8
优化命令(合并两次jq调用)
把两次jq操作合并为一次,减少管道环节的出错概率:
aws dynamodb scan --table-name MyTable --select ALL_ATTRIBUTES --page-size 500 --max-items 100000 --output json --profile production | jq -r '.Items | (.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ].S])[] | @csv' > export.my-table.csv
内容的提问来源于stack exchange,提问作者Bruno F S Leite
相关产品推荐
相关产品推荐

