Iniciante12 min de leitura

Como exportar uma tabela DynamoDB para CSV (4 maneiras)

DynamoDB não possui botão nativo "exportar para CSV". Cada valor volta embrulhado em DynamoDB's empacotado JSON{"S": "..."}, {"N": "123"}, {"M": {...}} — e uma tabela pode conter mapas aninhados, listas e conjuntos sem representação óbvia de coluna plana. Então, "exportar DynamoDB para CSV" é na verdade, dois problemas: tire os itens e achate o JSON digitado em linhas. Nem o console nem a exportação gerenciada realizam a segunda etapa para você.

Este guia começa com o modo como você executa as duas etapas e, em seguida, aborda o três rotas de ferramentas AWS e quando cada uma é a escolha certa.

Como exporto uma tabela DynamoDB para CSV?

Abra a tabela em DynoTable, filtre pelas linhas você deseja e exporte o resultado para CSV com um clique - digite descritores valores desembrulhados e aninhados nivelados para você (Método 1). Construindo a partir de AWS ferramentas em vez disso: digitalize com a CLI e remodele com jq para uma pequena tabela (Método 2), use a exportação gerenciada do S3 para grandes tabelas (Método 3) ou escreva um script curto quando você precisar de modelagem personalizada (Método 4).

  • Filtrado/formatado CSV (um subconjunto de colunas, apenas alguns itens): uma GUI exportar (Método 1) ou um script. A exportação gerenciada do S3 fornece a tabela inteira, não filtrada.
  • Mesa pequena, ad-hoc, somente terminal: AWS CLI scan + jq (Método 2). Tudo bem até que os atributos aninhados sejam exibidos para cima.
  • Tabela grande (GBs+): DynamoDB exportar para S3 (Método 3) e, em seguida, converta o despejar. Ele é executado de forma assíncrona e não consome nenhuma capacidade de leitura — mas gera DynamoDB JSON, não CSV.

Método 1: exportação com um clique em DynoTable

DynoTable trata a exportação como parte da navegação: execute ou filtro uma consulta, pressione ⌘⇧E (ou o botão Exportar na barra de ferramentas da guia) e escolha o que será exibido:

  • Formatos: CSV (uma linha por item, com cabeçalhos — define serialize como JSON matrizes dentro de uma célula), JSON e NDJSON. JSON/NDJSON venha desempacotado (simples "count": 3) ou empacotado DynamoDB-JSON quando você precisa de uma viagem de ida e volta sem perdas que preserve grandes números.
  • Escopos: as linhas carregadas atualmente, apenas sua seleção ou o correspondência completa do filtro — todos os itens correspondentes à sua consulta, transmitidos diretamente de DynamoDB em vez de apenas o que está na tela. Esse último é o exportação filtrada que o snapshot gerenciado do S3 não pode fazer.
  • Destino: área de transferência ou arquivo. Para capturas únicas, clique com o botão direito em uma linha e Copiar como… coloca CSV, JSON, NDJSON ou DynamoDB-JSON diretamente no área de transferência, sem diálogo.
Caixa de diálogo de exportação de DynoTable: formato (CSV / JSON / NDJSON), escopo da seleção até a correspondência completa do filtro e área de transferência ou destino do arquivo.
Caixa de diálogo de exportação de DynoTable: formato (CSV / JSON / NDJSON), escopo da seleção até a correspondência completa do filtro e área de transferência ou destino do arquivo.

Os problemas de achatamento que quebram as rotas DIY abaixo são resolvidos: digite descritores são desembrulhados, mapas e listas aninhados são nivelados e renomeados colunas fluem para os cabeçalhos CSV. Grandes exportações desconecte e execute o plano de fundo - transmitido para o disco linha por linha, sobrevivendo às alternâncias de guias e até mesmo recarregar um aplicativo — para que uma exportação de vários gigabytes nunca precise caber na memória.

É um cliente desktop DynamoDB, a mesma ferramenta que você já usa para navegar no mesa; veja como ele se compara a outras GUIs DynamoDB. Quando você não o usaria? Quando a exportação deve ser executada sem supervisão em um pipeline - é isso que a rota do script (Método 4) é para.

Método 2: AWS varredura CLI + jq

Para uma tabela pequena você pode digitalizá-la e remodelar a saída com jq. Um Scancada item da tabela e retorna em páginas de até 1 MB; a CLI segue a paginação para você automaticamente (AWS documentos: Scanning tabelas).

aws dynamodb scan --table-name MyTable --output json \
  | jq -r '.Items[] | [.id.S, .name.S, .price.N] | @csv' \
  > out.csv

O problema está na linha jq: você tem que escrever à mão .id.S, .name.S, .price.N — ultrapassando o descritor de tipo de cada atributo (S, N, B, BOOL, M, L, SS, NS, BS) para obter o valor bruto. Isso é administrável para um mesa plana com três colunas de string. Tudo desmorona no momento em que você tem:

  • Mapas/listas aninhados{"M": {...}} ou {"L": [...]} não possuem uma única coluna para achatar em; @csv engasga ou você codifica a célula com JSON manualmente.
  • Conjuntos{"SS": ["a","b"]} é um array, não um escalar.
  • Atributos esparsos — DynamoDB não tem esquema, então o item A pode ter um preço e item B não pode. Sua lista de colunas fixas elimina ou desalinha colunas silenciosamente.

Também não existe --output csv — os formatos de saída da CLI são json, yaml, text, table e off, nenhum dos quais entende os tipos DynamoDB. Então você ainda precisa de jq (ou um script) para remover as tags de tipo. Essa é a principal razão pela qual "exportar DynamoDB tabela para CSV via AWS CLI" nunca é uma linha única além do caso trivial.

Para exportar uma tabela inteira maior desta forma sem levar o dia todo, paralelize o digitalizar com --segment / --total-segments (AWS documentos: verificação paralela — DynamoDB "atribui itens a segmentos aplicando uma função hash a cada item chave de partição", para que os segmentos possam ser desiguais) e leia paginação para não parar na primeira página de 1 MB.

Método 3: DynamoDB exportar para S3 (tabelas grandes)

Para tabelas de qualquer tamanho real, a exportação gerenciada para Amazon S3 é a ferramenta certa. Ele exporta um instantâneo de qualquer ponto da sua recuperação pontual (PITR) janela - então PITR deve ser habilitado na tabela primeiro, ou a exportação falhará com PointInTimeRecoveryUnavailableException — é executado de forma assíncrona, e não consome unidades de capacidade de leitura, portanto tem impacto zero na sua tabela taxa de transferência ou disponibilidade (AWS documentos: “As exportações são assíncronas, não consomem unidades de capacidade de leitura (RCUs) e não possuem impacto no desempenho e disponibilidade da tabela"; "Você precisa ativar PITR na sua mesa para usar a funcionalidade de exportação"). Isso também é o que o Exporta para S3 do console a ação é desencadeada sob o capô: o console é apenas um front end para o mesmo API, portanto, ele carrega o mesmo requisito PITR e a mesma saída JSON.

aws dynamodb export-table-to-point-in-time \
  --table-arn arn:aws:dynamodb:us-east-1:123456789012:table/MyTable \
  --s3-bucket my-export-bucket \
  --export-format DYNAMODB_JSON

A única pegadinha: a exportação S3 não gera CSV. Ela escreve DynamoDB JSON ou Amazon Ion apenas, como arquivos compactados em gzip em Formato JSON-lines (um item por linha), mais manifesto arquivos (AWS documentos: formato de saída de exportação — arquivos de dados são escritos como .json.gz, "o formato é JSON linhas", ao lado manifest-summary.json / manifest-files.json). Você ainda precisa de uma etapa de conversão depois:

  • Athena / Glue lê o DynamoDB JSON exportado diretamente - aponte uma tabela para o Prefixo S3, então escreva CSV de um SELECT (esta é a "exportação DynamoDB usual para S3 depois para pipeline CSV"). AWS observa que "muitos serviços AWS, como Athena e AWS Glue, irá analisar este formato automaticamente" (formato de saída de exportação).
  • Role o seu próprio — descompacte os arquivos .gz, analise cada linha JSON e nivele (o mesmo problema de nivelamento de qualquer outro método).

É também um instantâneo de tabela completa: não há nenhum filtro do lado do servidor apenas para exportar alguns itens. Se precisar de um subconjunto, você pode filtrar após o fato no Athena ou use uma GUI (Método 1) / script.

Método 4: um script rápido (boto3/Node)

Quando a exportação deve ser executada autônoma — um trabalho noturno, uma etapa de CI — um pequeno script supera tudo acima. A vantagem é que os SDKs AWS unmarshall o JSON digitado para você: a interface de recursos do boto3 e o JS SDK DynamoDBDocumentClient retorna {"price": 2000} simples em vez de {"price": {"N": "2000"}} (a interface de recursos do boto3 faz "a digitação dos dados implícito", de acordo com o AWS Guia Python; o JS DocumentClient "converte dados de resposta anotados em tipos JavaScript nativos", por @aws-sdk/lib-dynamodb).

import boto3, csv

table = boto3.resource("dynamodb").Table("MyTable")
rows, resp = [], table.scan()
rows += resp["Items"]
while "LastEvaluatedKey" in resp:                  # paginate to the end
    resp = table.scan(ExclusiveStartKey=resp["LastEvaluatedKey"])
    rows += resp["Items"]

with open("out.csv", "w", newline="") as f:
    w = csv.DictWriter(f, fieldnames=["id", "name", "price"])
    w.writeheader()
    for r in rows:
        w.writerow({k: r.get(k) for k in w.fieldnames})

Você ainda possui duas decisões que o SDK não pode tomar por você: como nivelar aninhados mapeia/listas em colunas (JSON-codifica a célula? caminho de ponto as chaves?), e o que fazer com atributos esparsos (aqui uma chave ausente se torna uma célula vazia via r.get(k)). E não descarte o loop LastEvaluatedKey — uma única chamada scan() retorna apenas o primeira página de 1 MB, portanto, sem ela você exporta silenciosamente parte da tabela.

Mesma advertência do Método 2: uma varredura de tabela completa aqui ainda consome capacidade de leitura e compete com o tráfego ao vivo. Para uma mesa grande, prefira Método 3 e remodele o dump.

Pegadinhas: DynamoDB JSON vs plana CSV

Qualquer que seja o método escolhido, o mesmo punhado de incompatibilidades entre os dados de DynamoDB modelo e um apartamento CSV vão te morder:

  • Descritores de tipo. A saída Raw API / CLI / S3-export agrupa todos os valores ({"S": "..."}, {"N": "123"}). Você o desembrulha por meio de um SDK ou remove o descreva você mesmo. O conjunto completo é S, N, B, BOOL, NULL, M, L, SS, NS, BS — veja DynamoDB tipos de dados.
  • Mapas e listas aninhados (M, L) podem aninhar até 32 níveis de profundidade (AWS documentos: tipos de dados — lista e mapa "podem ser aninhados um no outro, para representar estruturas de dados complexas até 32 níveis de profundidade") e não possuem forma natural de coluna única. Decida com antecedência: JSON-codifique a célula ou exploda as chaves aninhadas em colunas com caminho de ponto (address.city).
  • Conjuntos (SS/NS/BS) são coleções não ordenadas, não escalares — AWS avisa "a ordem dos valores dentro de um conjunto não é preservada" (tipos de dados) — então achate uma string delimitada e não confie na ordem dos elementos.
  • Atributos esparsos. DynamoDB não tem esquema, então dois itens podem ter diferentes atributos. Não há conjunto de colunas fixas; unir as chaves em todos os itens ou colunas ficarão desalinhadas. Esta é uma consequência direta design de tabela única, onde uma tabela contém vários formas de entidade.
  • Paginação. Scan (e Query) retornam no máximo 1 MB por chamada. Se você não loop em LastEvaluatedKey você exportará silenciosamente apenas a primeira página. Veja paginação.
  • Precisão numérica. DynamoDB números carregam até 38 dígitos de precisão e viajam como strings (AWS documentos: tipos de dados: “Os números podem ter até 38 dígitos de precisão”; "Todos os números são enviados através do rede para DynamoDB como strings"); software de planilha pode forçar números longos ou IDs em carros flutuantes e perdem dígitos. Mantenha-os como texto.

FAQ

Qual é a maneira mais rápida de exportar uma tabela DynamoDB para CSV? Uma GUI que faz o nivelamento para você: em DynoTable, filtre o tabela, pressione ⌘⇧E, escolha CSV e escolha um escopo - do selecionado linhas até cada item ao qual o filtro corresponde, transmitido de DynamoDB. Tipo descritores e valores aninhados são tratados automaticamente.

Como exporto uma tabela DynamoDB para CSV com a CLI AWS? Scan a tabela e remodele a saída com jq (Método 2): aws dynamodb scanjq para remover o descritor de tipo de cada valor → @csv. Não há conhecimento de DynamoDB --output csv, então você sempre faz a remoção de tipo sozinho e ele quebra no aninhado mapas, listas e conjuntos.

Posso exportar uma tabela DynamoDB diretamente para CSV de AWS? Não em uma etapa. O console e a exportação S3 gerenciada produzem DynamoDB JSON ou Amazon Ion, nunca CSV. Você sempre precisa de uma etapa de conversão — CLI + jq, um script, Athena/Glue sobre o dump S3 ou uma GUI que faz o nivelamento para você.

Como posso exportar uma tabela DynamoDB inteira sem afetar a produção? Use o recurso exportar para S3 (Método 3). Ele é executado de forma assíncrona e consome sem unidades de capacidade de leitura, por isso não compete com o tráfego ao vivo — ao contrário de um Scan, que é medido em relação ao rendimento da sua tabela (AWS documentos). Requer que PITR esteja habilitado e exporte a tabela completa, não um subconjunto filtrado.

Como faço para exportar DynamoDB para S3 como CSV? A exportação gerenciada grava apenas DynamoDB JSON / Ion em S3, então "to CSV" é um segundo hop: registre o prefixo de exportação como uma tabela Athena (ou Glue) e escreva CSV de um SELECIONE. Não há --export-format CSV.

Como faço para exportar DynamoDB para Excel? Exporte primeiro para CSV (qualquer método acima) e, em seguida, abra o CSV no Excel - mantendo o tempo IDs numéricos como texto para que não sejam forçados a flutuar. Não há .xlsx direto exportar de DynamoDB; DynoTable salva a visualização atual diretamente em um pronto para planilha CSV.

Por que meu JSON exportado tem {"S": ...} e {"N": ...} em todos os lugares? Isso é DynamoDBformato wire - cada valor é marcado com um tipo descritor. Desempacote-o com um SDK, o Conversor DynamoDB JSON ou uma GUI antes de escrever CSV. O formato da ligação é o mesmo, quer os dados venham do API, da CLI ou do Exportação S3.

Navegue, filtre e exporte suas próprias tabelas para CSV com DynoTable, ou desembrulhe uma amostra de DynamoDB JSON no Conversor JSON primeiro.

Atualizado