Principiante12 min di lettura

Come esportare una tabella DynamoDB in CSV (4 modi)

DynamoDB non ha un pulsante nativo "esporta in CSV". Ogni valore ritorna avvolto Marshalling di DynamoDB JSON{"S": "..."}, {"N": "123"}, {"M": {...}} — e una tabella può contenere mappe nidificate, elenchi e insiemi senza evidente rappresentazione a colonne piatte. Quindi "esporta DynamoDB in CSV" lo è in realtà due problemi: tirare fuori gli elementi, quindi appiattire il JSON digitato in righe. Né la console né l'esportazione gestita eseguono il secondo passaggio per te.

Questa guida inizia con il modo in cui vengono eseguiti entrambi i passaggi per te, quindi copre il tre percorsi di AWS-tooling e quando ognuno è la chiamata giusta.

Come posso esportare una tabella DynamoDB in CSV?

Apri la tabella in DynoTable, filtra in base alle righe che desideri ed esporta il risultato in CSV con un clic: digita i descrittori valori scartati e nidificati appiattiti per te (Metodo 1). Costruendolo da AWS strumenti invece: scansiona con la CLI e rimodella con jq per una piccola tabella (Metodo 2), utilizzare l'esportazione S3 gestita per grandi tabelle (Metodo 3) oppure scrivi un script breve quando è necessaria una modellatura personalizzata (Metodo 4).

  • Filtrato/formato CSV (un sottoinsieme di colonne, solo alcuni elementi): una GUI export (Metodo 1) o uno script. L'esportazione S3 gestita fornisce l'intera tabella, senza filtri.
  • Tabella piccola, ad hoc, solo terminale: AWS CLI scan + jq (Metodo 2). Va bene finché non vengono visualizzati gli attributi nidificati su.
  • Tabella di grandi dimensioni (GB+): DynamoDB esporta in S3 (Metodo 3), quindi convertire il file discarica. Funziona in modo asincrono e non consuma nessuna capacità di lettura, ma... uscite DynamoDB JSON, non CSV.

Metodo 1: esportazione con un clic in DynoTable

DynoTable tratta l'esportazione come parte della navigazione: esegui o filtro una query, premi ⌘⇧E (o il pulsante Esporta nella barra degli strumenti della scheda) e scegli cosa pubblicare:

  • Formati: CSV (una riga per articolo, con intestazioni: imposta serializza come JSON array all'interno di una cella), JSON e NDJSON. JSON/NDJSON vieni senza marshalling (semplice "count": 3) o con marshalling DynamoDB-JSON quando si necessitano di un viaggio di andata e ritorno senza perdite che preservi grandi numeri.
  • Ambiti: le righe attualmente caricate, solo la tua selezione, o il corrispondenza filtro completo: ogni elemento corrispondente alla tua query, trasmesso direttamente in streaming da DynamoDB anziché solo ciò che è sullo schermo. Quest'ultimo è il l'esportazione filtrata che lo snapshot S3 gestito non può eseguire.
  • Destinazione: appunti o file. Per acquisti una tantum, fai clic con il pulsante destro del mouse su una riga e Copia come... inserisce CSV, JSON, NDJSON, o DynamoDB-JSON direttamente sulla appunti, nessuna finestra di dialogo.
Finestra di dialogo di esportazione di DynoTable: formato (CSV / JSON / NDJSON), ambito dalla selezione alla corrispondenza completa del filtro e destinazione degli appunti o del file.
Finestra di dialogo di esportazione di DynoTable: formato (CSV / JSON / NDJSON), ambito dalla selezione alla corrispondenza completa del filtro e destinazione degli appunti o del file.

Vengono gestiti i problemi di appiattimento che interrompono i percorsi DIY seguenti: type i descrittori vengono scartati, le mappe e gli elenchi annidati vengono appiattiti e rinominati le colonne scorrono fino alle intestazioni CSV. Grandi esportazioni si staccano e si incastrano lo sfondo: trasmesso in streaming sul disco riga per riga, con cambi di scheda sopravvissuti e anche il ricaricamento di un'app, quindi un'esportazione di più gigabyte non deve mai adattarsi alla memoria.

È un client desktop DynamoDB, lo stesso strumento che già usi per navigare nel file tabella; guarda come si confronta con altre DynamoDB GUI. Quando non lo useresti? Quando l'esportazione deve essere eseguita in modo automatico in a pipeline: questo è il percorso dello script (Metodo 4) è per.

Metodo 2: AWS Scansione CLI + jq

Per una tabella piccola puoi scansionarla e rimodellare l'output con jq. Si legge "Scan". ogni elemento nella tabella e lo restituisce in pagine fino a 1 MB; la CLI segue automaticamente l'impaginazione (AWS documenti: Scanning tabelle).

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

Il problema sta nella riga jq: devi scrivere a mano .id.S, .name.S, .price.N: supera il descrittore di tipo di ciascun attributo (S, N, B, BOOL, M, L, SS, NS, BS) per ottenere il valore grezzo. È gestibile per a tabella piatto con tre colonne stringate. Cade a pezzi nel momento in cui hai:

  • Mappe/elenchi nidificati{"M": {...}} o {"L": [...]} non hanno una singola colonna su cui appiattire; @csv si blocca oppure codifichi la cella con JSON manualmente.
  • Sets{"SS": ["a","b"]} è un array, non uno scalare.
  • Attributi sparsi — DynamoDB non è schematico, quindi l'articolo A può avere un prezzo e l'articolo B potrebbe non esserlo. L'elenco di colonne fisse elimina o disallinea silenziosamente le colonne.

Inoltre, non esiste alcun --output csv: i formati di output della CLI sono json, yaml, text, table e off, nessuno dei quali comprende i tipi DynamoDB. Quindi tu è ancora necessario jq (o uno script) per rimuovere i tag type. Questo è il motivo principale per cui "export Dalla tabella DynamoDB a CSV tramite AWS CLI" non è mai una riga oltre il caso banale.

Per esportare un'intera tabella più grande in questo modo senza impiegare tutto il giorno, parallelizza il file scansiona con --segment / --total-segments (AWS documenti: scansione parallela — DynamoDB "assegna gli elementi a segmenti applicando una funzione hash a ciascun elemento chiave di partizione", quindi i segmenti possono essere irregolari) e leggere pagination in modo da non fermarti alla prima pagina da 1 MB.

Metodo 3: DynamoDB esporta in S3 (tabelle di grandi dimensioni)

Per tabelle di qualsiasi dimensione reale, l'esportazione gestita su Amazon S3 è lo strumento giusto. Esporta uno snapshot da qualsiasi punto del ripristino point-in-time (PITR) window - quindi PITR deve essere prima abilitato sulla tabella, altrimenti l'esportazione fallirà PointInTimeRecoveryUnavailableException — funziona in modo asincrono, e non consuma unità di capacità di lettura, quindi non ha alcun impatto sulla tabella velocità effettiva o disponibilità (AWS documenti: "Le esportazioni sono asincrone, non consumano unità di capacità di lettura (RCUs) e non hanno impatto sulle prestazioni e sulla disponibilità della tabella"; "Devi abilitare PITR sulla tua tabella per utilizzare la funzionalità di esportazione"). Questo è anche ciò che Esporta su S3 della console l'azione si innesca sotto il cofano: la console è solo un front-end per lo stesso API, quindi porta lo stesso requisito PITR e lo stesso output 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

L'unico problema: l'esportazione S3 non restituisce CSV. Scrive DynamoDB JSON o solo Amazon Ion, come file compressi in formato g Formato JSON-lines (un elemento per riga), più manifest file (AWS documenti: formato di output di esportazione — i file di dati sono scritti come .json.gz, "il formato è JSON righe", accanto manifest-summary.json / manifest-files.json). Hai ancora bisogno di una fase di conversione successivamente:

  • Athena / Glue legge direttamente il DynamoDB JSON esportato - punta una tabella verso Prefisso S3, quindi scrivi CSV da un SELECT (questo è il solito "esporta DynamoDB a S3 quindi alla pipeline CSV"). AWS nota che "molti servizi AWS, come Athena e AWS Glue, analizzerà questo formato automaticamente" (formato di output di esportazione).
  • Crea il tuo: decomprimi i file .gz, analizza ogni riga JSON e appiattisci it (stesso problema di appiattimento di ogni altro metodo).

È anche uno snapshot di tabella completa: non c'è nessun filtro lato server da esportare solo alcuni articoli. Se hai bisogno di un sottoinsieme, filtra dopo il fatto in Athena o tu utilizzare invece una GUI (Metodo 1) / script.

Metodo 4: uno script veloce (boto3/Node)

Quando l'esportazione deve essere eseguita non presidiata (un lavoro notturno, un passaggio CI) un piccolo lo script batte tutto quanto sopra. La vittoria è che gli AWS SDK unmarshall digitato JSON per te: l'interfaccia delle risorse di boto3 e l'SDK JS DynamoDBDocumentClient restituisce {"price": 2000} invece di {"price": {"N": "2000"}} (l'interfaccia delle risorse di boto3 rende "la digitazione dei dati implicito", secondo il AWS Guida Python; JS DocumentClient "converte i dati di risposta annotati in tipi JavaScript nativi", per @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})

Hai ancora due decisioni che l'SDK non può prendere per te: come appiattire i file nidificati mappe/elenchi in colonne (JSON-codifica la cella? percorso delle chiavi?) e cosa fare con attributi sparsi (qui una chiave mancante diventa una cella vuota tramite r.get(k)). E non eliminare il ciclo LastEvaluatedKey: una singola chiamata a scan() restituisce solo il file prima pagina da 1 MB, quindi senza di essa esporti silenziosamente parte della tabella.

Stesso avvertimento del Metodo 2: una scansione di una tabella completa consuma comunque capacità di lettura e compete con il traffico in tempo reale. Per una tabella grande, preferisci Metodo 3 e rimodellare il dump.

Gotchas: DynamoDB JSON contro piatto CSV

Qualunque sia il metodo scelto, si riscontrano sempre le stesse discrepanze tra i dati di DynamoDB modello e un flat CSV ti morderà:

  • Descrittori di tipo. L'output raw API / CLI / S3-export racchiude ogni valore ({"S": "..."}, {"N": "123"}). Puoi scartarlo tramite un SDK o rimuovere il file descrittore te stesso. Il set completo è S, N, B, BOOL, NULL, M, L, SS, NS, BS — vedi tipi di dati DynamoDB.
  • Mappe ed elenchi nidificati (M, L) possono nidificare fino a 32 livelli di profondità (AWS documenti: tipi di dati — list e map "possono essere nidificati l'uno nell'altro, per rappresentare strutture di dati complesse fino a 32 livelli di profondità") e non hanno una forma naturale a colonna singola. Decidi in anticipo: JSON: codifica la cella o esplodi le chiavi nidificate in colonne con percorso punto (address.city).
  • Gli Insiemi (SS/NS/BS) sono raccolte non ordinate, non scalari — AWS avverte "l'ordine dei valori all'interno di un set non viene preservato" (tipi di dati) — quindi appiattisci su una stringa delimitata e non fare affidamento sull'ordine degli elementi.
  • Attributi sparsi. DynamoDB è senza schema, quindi due elementi possono avere valori diversi attributi. Non esiste un set di colonne fisso; unisci le chiavi di tutti gli elementi o le colonne saranno disallineate. Questa è una conseguenza diretta di design a tabella singola, dove una tabella ne contiene diversi forme di entità.
  • Impostazione. Scan (e Query) restituiscono al massimo 1 MB per chiamata. Se non lo fai loop su "LastEvaluatedKey" esporterai silenziosamente solo la prima pagina. Vedi impaginazione.
  • Precisione del numero. I numeri DynamoDB contengono fino a 38 cifre di precisione e viaggiare come stringhe (AWS documenti: tipi di dati: "I numeri possono avere fino a 38 cifre di precisione"; "Tutti i numeri vengono inviati attraverso il rete a DynamoDB come stringhe"); il software per fogli di calcolo può forzare numeri lunghi o Gli ID vengono trasformati in float e perdono cifre. Conservateli come testo.

FAQ

Qual è il modo più veloce per esportare una tabella DynamoDB in CSV? Una GUI che esegue l'appiattimento per te: in DynoTable, filtra il tabella, premi ⌘⇧E, seleziona CSV e scegli un ambito, dall'ambito selezionato righe fino a ogni elemento corrispondente al filtro, trasmesso in streaming da DynamoDB. Digitare i descrittori e i valori nidificati vengono gestiti automaticamente.

Come posso esportare una tabella DynamoDB in CSV con la AWS CLI? Scan la tabella e rimodella l'output con jq (metodo 2): aws dynamodb scanjq per eliminare il descrittore del tipo di ciascun valore → @csv. Non c'è DynamoDB consapevole --output csv, quindi esegui sempre la rimozione del tipo da solo e si interrompe su nidificato mappe, elenchi e insiemi.

Posso esportare una tabella DynamoDB direttamente in CSV da AWS? Non in un solo passaggio. La console e l'esportazione S3 gestita producono entrambe DynamoDB JSON o Amazon Ion, mai CSV. Hai sempre bisogno di un passaggio di conversione: CLI + jq, uno script, Athena/Incolla sul dump S3 o su una GUI che esegue l'appiattimento per te.

Come posso esportare un'intera tabella DynamoDB senza influire sulla produzione? Utilizza la funzione esporta in S3 (metodo 3). Funziona in modo asincrono e consuma nessuna unità di capacità di lettura, quindi non compete con il traffico in tempo reale, a differenza di a Scan, che viene misurato rispetto al throughput della tua tabella (AWS documenti). Richiede che PITR sia abilitato ed esporta la tabella completa, non un sottoinsieme filtrato.

Come posso esportare DynamoDB su S3 come CSV? L'esportazione gestita scrive solo DynamoDB JSON / Ion su S3, quindi "to CSV" è un secondo hop: registra il prefisso di esportazione come tabella Athena (o Glue) e scrivi CSV da a "SELEZIONA". Non esiste --export-format CSV.

Come posso esportare DynamoDB in Excel? Esporta prima in CSV (qualsiasi metodo sopra), quindi apri CSV in Excel, mantenendo a lungo ID numerici come testo in modo che non siano forzati a float. Non esiste un .xlsx diretto esportazione da DynamoDB; DynoTable salva la vista corrente direttamente in a pronto per il foglio di calcolo CSV.

Perché il mio JSON esportato ha {"S": ...} e {"N": ...} ovunque? Questo è DynamoDBformato wire: ogni valore è contrassegnato con un tipo descrittore. Annulla il marshalling con un SDK, il file DynamoDB JSON convertitore o una GUI prima di scrivere CSV. Il formato del cavo è lo stesso indipendentemente dal fatto che i dati provengano da API, CLI o Esportazione S3.

Sfoglia, filtra ed esporta le tue tabelle in CSV con DynoTable, oppure scartare un campione di DynamoDB JSON nel JSON convertitore per primo.

Aggiornato