【问题标题】:Export a DynamoDB table as CSV through AWS CLI (without using pipeline)通过 AWS CLI 将 DynamoDB 表导出为 CSV(不使用管道)
【发布时间】:2022-04-09 22:31:12
【问题描述】:

我是 AWS CLI 的新手,我正在尝试以 CSV 格式导出我的 DynamoDB 表,以便可以将其直接导入 PostgreSQL。有没有办法使用 AWS CLI 做到这一点?

我遇到了这个命令:aws dynamodb scan --table-name <table-name> - 但这不提供 CSV 导出选项。

使用此命令,我可以在终端中看到输出,但我不确定如何将其写入文件。

【问题讨论】:

    标签: amazon-web-services csv amazon-dynamodb aws-cli


    【解决方案1】:

    如果所有项目都具有相同的属性,例如idname 都是字符串,然后运行:

    aws dynamodb scan \
        --table-name mytable \
        --query "Items[*].[id.S,name.S]" \
        --output text
    

    这将提供制表符分隔的输出。您可以使用 > output.txt 将其重定向到文件,然后您可以轻松地将制表符转换为 csv 的逗号。

    请注意,您可能需要根据 scan documentation 进行分页:

    如果扫描项目的总数超过最大数据集大小限制 1 MB,则扫描停止并将结果作为 LastEvaluatedKey 值返回给用户,以便在后续操作中继续扫描。结果还包括超出限制的项目数。扫描可能导致没有符合过滤条件的表数据。

    另一个选择是 github 上的 DynamoDBtoCSV 项目。

    【讨论】:

    • 所有项目的属性相同,但数据类型不同。此查询是否适用于不同的数据类型?
    • 在这种情况下只需提供适当的数据类型,例如:name.S、zipcode.N、isawesome.B。
    • 有不同的方法来实现吗?因为我的输出显示在控制台中,这需要大量时间来处理大数据......
    • @Khan 网络搜索将产生用于导出 DynamoDB 表的其他选项,但影响性能的关键因素将是表的预置读取容量 (RCU)。您可能想暂时增加它,进行导出,然后将其调回。
    • @n0obcoder 扫描实际上隐式限制了返回结果的数量(我会更新答案),但您也可以提供--max-items N。请参阅 aws dynamodb scan 文档。
    【解决方案2】:

    对于本地主机 dynamodb:

    $aws dynamodb scan --table-name AOP --region us-east-1 --endpoint-url
    http://localhost:8000 --output json > /home/ohelig/Desktop/a.json
    

    对于 dynamodb:

    $aws dynamodb scan --table-name AOP --region us-east-1 --output json > /home/ohelig/Desktop/a.json
    

    然后将 JSON 转换为 CSV 或其他格式。

    我已经修改了上面的答案以使其清楚。

    【讨论】:

      【解决方案3】:

      在不退出列表的情况下完全导出所有列的更好方法是Dynamo db export to csv

      基本上

      aws dynamodb scan --table-name my-table --select ALL_ATTRIBUTES --page-size 500 --max-items 100000 --output json | jq -r '.Items' | jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ].S])[] | @csv' > export.my-table.csv
      

      【讨论】:

      • 谢谢,这是一个很好的解决方案!缺点是如果该字段是一个 Set 它似乎是空的......在这种情况下,您需要使用上面的答案
      • .S 表示这只适用于字符串字段。将其替换为 .N 仅适用于数字字段。如何让它同时适用于字符串和数字?
      • 它对我来说开箱即用,只需要更改表名。它应该是最佳答案。
      • 我的一个字段可能包含波斯字符,因此跳过了名为“错误”的整个列。
      【解决方案4】:

      您可以使用jq将aws cli给出的json输出转换为csv

      aws dynamodb scan --table-name mytable --query "Items[*].[id.S,name.S]" --output json | jq -r '.[] | @csv' > dump.csv
      

      【讨论】:

      • 我收到jq: error (at <stdin>:1811): array ([{"N":"1559...) is not valid in a csv row
      • 我最喜欢这个答案。
      • 如果你有地图类型,这将不起作用
      【解决方案5】:

      你可以使用jq将json转成csv

      aws dynamodb query \
          --table-name <table-name> \
          --index-name <index-name> \
          --select SPECIFIC_ATTRIBUTES \
          --projection-expression "attributes1, attributes2,..." \
          --key-condition-expression "#index1 = :index1 AND #index2 = :index2" \
          --expression-attribute-names '{"#index1": "index1","#index2": "index2"}' \
          --expression-attribute-values '{":index1": {"S":"key1"},":index2": {"S":"key2"}}' \
          --output json | jq -r '.Items' | jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ][]?])[] | @csv' > output.csv
      

      但要小心,如果列数据长度不同会产生错误的输出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        • 2019-03-23
        • 1970-01-01
        • 2021-08-24
        相关资源
        最近更新 更多