DynamoDB-Tabelle nach CSV exportieren (4 Wege)
DynamoDB hat keinen nativen „Nach CSV exportieren"-Button. Jeder Wert kommt in
DynamoDBs marshalltem JSON verpackt zurück —
{"S": "..."}, {"N": "123"}, {"M": {...}} — und eine Tabelle kann
verschachtelte Maps, Listen und Sets ohne offensichtliche
Flachspalten-Darstellung enthalten. „DynamoDB nach CSV exportieren" sind also
in Wahrheit zwei Probleme: die Items herausholen und dann das typisierte
JSON zu Zeilen plätten. Weder die Konsole noch der verwaltete Export
erledigt den zweiten Schritt für dich.
Dieser Guide beginnt mit dem Weg, der beide Schritte für dich erledigt, und behandelt dann die drei AWS-Tooling-Routen und wann welche die richtige Wahl ist.
Wie exportiere ich eine DynamoDB-Tabelle nach CSV?
Öffne die Tabelle in DynoTable, filtere auf
die gewünschten Zeilen und exportiere das Ergebnis mit einem Klick nach CSV —
Typ-Deskriptoren ausgepackt und verschachtelte Werte für dich geplättet
(Methode 1). Baust du es
stattdessen aus AWS-Tooling: Scanne mit der CLI und forme mit jq um für
eine kleine Tabelle (Methode 2), nutze den
verwalteten S3-Export für große Tabellen
(Methode 3) oder schreibe
ein kurzes Skript, wenn du individuelles Umformen brauchst
(Methode 4).
- Gefiltertes / geformtes CSV (eine Teilmenge der Spalten, nur manche Items): ein GUI-Export (Methode 1) oder ein Skript. Der verwaltete S3-Export gibt dir die ganze Tabelle, ungefiltert.
- Kleine Tabelle, ad hoc, nur Terminal: AWS CLI
scan+jq(Methode 2). Funktioniert, bis verschachtelte Attribute auftauchen. - Große Tabelle (GBs+): DynamoDB-Export nach S3 (Methode 3), dann den Dump konvertieren. Er läuft asynchron und verbraucht keine Lesekapazität — gibt aber DynamoDB-JSON aus, kein CSV.
Methode 1: Ein-Klick-Export in DynoTable
DynoTable behandelt den Export als Teil des Durchstöberns: Führe eine Abfrage aus oder filtere sie, drücke ⌘⇧E (oder den Export-Button in der Tab-Toolbar) und wähle, was rausgeht:
- Formate: CSV (eine Zeile pro Item, mit Headern — Sets serialisieren
als JSON-Arrays innerhalb einer Zelle), JSON und NDJSON. JSON/NDJSON
kommen unmarshallt (schlicht
"count": 3) oder als marshalltes DynamoDB-JSON, wenn du einen verlustfreien Round-Trip brauchst, der große Zahlen bewahrt. - Umfänge: die aktuell geladenen Zeilen, nur deine Auswahl oder der volle Filtertreffer — jedes Item, das deine Abfrage matcht, direkt aus DynamoDB gestreamt statt nur das, was auf dem Bildschirm ist. Letzteres ist der gefilterte Export, den der verwaltete S3-Snapshot nicht kann.
- Ziel: Zwischenablage oder Datei. Für schnelle Einmal-Grabs rechtsklicke eine Zeile, und Copy as… legt CSV, JSON, NDJSON oder DynamoDB-JSON direkt in die Zwischenablage, ohne Dialog.

Die Plätt-Probleme, an denen die DIY-Routen unten brechen, sind erledigt: Typ-Deskriptoren werden ausgepackt, verschachtelte Maps und Listen geplättet, und umbenannte Spalten fließen in die CSV-Header durch. Große Exporte lösen sich ab und laufen im Hintergrund — Zeile für Zeile auf die Platte gestreamt, Tab-Wechsel und sogar einen App-Reload überlebend — ein Multi-Gigabyte-Export muss also nie in den Speicher passen.
Es ist ein Desktop-DynamoDB-Client, dasselbe Tool, mit dem du die Tabelle ohnehin durchstöberst; siehe den Vergleich mit anderen DynamoDB-GUIs. Wann würdest du es nicht nutzen? Wenn der Export unbeaufsichtigt in einer Pipeline laufen muss — dafür ist die Skript-Route (Methode 4) da.
Methode 2: AWS-CLI-Scan + jq
Für eine kleine Tabelle kannst du sie scannen und die Ausgabe mit jq
umformen. Ein Scan liest jedes Item der Tabelle und liefert es in
Seiten von bis zu 1 MB; die CLI folgt der Paginierung automatisch für
dich
(AWS-Docs: Scanning tables).
aws dynamodb scan --table-name MyTable --output json \
| jq -r '.Items[] | [.id.S, .name.S, .price.N] | @csv' \
> out.csvDer Haken steckt in dieser jq-Zeile: Du musst .id.S, .name.S,
.price.N von Hand schreiben — an jedem Typ-Deskriptor (S, N, B,
BOOL, M, L, SS, NS, BS) des Attributs vorbeigreifen, um den
rohen Wert zu bekommen. Das ist machbar für eine flache Tabelle mit drei
String-Spalten. Es zerfällt in dem Moment, in dem du Folgendes hast:
- Verschachtelte Maps/Listen —
{"M": {...}}oder{"L": [...]}haben keine einzelne Spalte zum Plätten;@csvverschluckt sich, oder du JSON-enkodierst die Zelle von Hand. - Sets —
{"SS": ["a","b"]}ist ein Array, kein Skalar. - Sparse-Attribute — DynamoDB ist schemalos, Item A kann also ein
pricehaben und Item B nicht. Deine feste Spaltenliste lässt Spalten stillschweigend fallen oder verschiebt sie.
Es gibt außerdem gar kein --output csv — die Ausgabeformate der CLI sind
json, yaml, text, table und off, und keines versteht
DynamoDB-Typen. Du brauchst also weiterhin jq (oder ein Skript), um die
Typ-Tags zu entfernen. Das ist der Kerngrund, warum „DynamoDB-Tabelle per
AWS CLI nach CSV exportieren" jenseits des Trivialfalls nie ein Einzeiler
ist.
Um eine ganze größere Tabelle auf diesem Weg zu exportieren, ohne dass es
den ganzen Tag dauert, parallelisiere den Scan mit --segment /
--total-segments
(AWS-Docs: Parallel scan —
DynamoDB „weist Items Segmenten zu, indem es eine Hash-Funktion auf den
Partition Key jedes Items anwendet", Segmente können also ungleich sein),
und lies Paginierung, damit du nicht bei der ersten
1-MB-Seite aufhörst.
Methode 3: DynamoDB-Export nach S3 (große Tabellen)
Für Tabellen jeder ernsthaften Größe ist der verwaltete Export nach Amazon
S3 das richtige Werkzeug. Er exportiert einen Snapshot von einem
beliebigen Punkt deines Point-in-Time-Recovery-(PITR)-Fensters — PITR
muss also zuerst auf der Tabelle aktiviert sein, sonst schlägt der Export
mit
PointInTimeRecoveryUnavailableException
fehl —, läuft asynchron und
verbraucht keine Lesekapazitätseinheiten, hat also null Einfluss auf
Durchsatz oder Verfügbarkeit deiner Tabelle
(AWS-Docs:
„Exporte sind asynchron, sie verbrauchen keine Lesekapazitätseinheiten
(RCUs) und haben keinen Einfluss auf Tabellenleistung und -verfügbarkeit";
„Du musst PITR auf deiner Tabelle aktivieren, um die Exportfunktion zu
nutzen"). Das ist auch das, was die Exports to S3-Aktion der Konsole
unter der Haube auslöst: Die Konsole ist nur ein Frontend für dieselbe API,
trägt also dieselbe PITR-Anforderung und dieselbe JSON-Ausgabe.
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_JSONDer eine Fallstrick: Der S3-Export gibt kein CSV aus. Er schreibt
ausschließlich DynamoDB-JSON oder Amazon Ion, als gezippte Dateien
im JSON-Lines-Format (ein Item pro Zeile), plus
Manifest-Dateien
(AWS-Docs: export output format —
Datendateien werden als .json.gz geschrieben, „das Format ist JSON Lines",
neben manifest-summary.json / manifest-files.json). Du brauchst danach
weiterhin einen Konvertierungsschritt:
- Athena / Glue lesen das exportierte DynamoDB-JSON direkt — richte eine
Tabelle auf das S3-Präfix und schreibe CSV aus einem
SELECT(das ist die übliche „DynamoDB nach S3, dann nach CSV"-Pipeline). AWS merkt an, dass „viele AWS-Services wie Athena und AWS Glue dieses Format automatisch parsen" (Format der Export-Ausgabe). - Selbst bauen — die
.gz-Dateien entpacken, jede JSON-Zeile parsen und plätten (dasselbe Plätt-Problem wie bei jeder anderen Methode).
Es ist außerdem ein Full-Table-Snapshot: Es gibt keinen serverseitigen Filter, um nur manche Items zu exportieren. Brauchst du eine Teilmenge, filterst du entweder nachträglich in Athena oder nutzt stattdessen eine GUI (Methode 1) / ein Skript.
Methode 4: ein schnelles Skript (boto3 / Node)
Wenn der Export unbeaufsichtigt laufen muss — ein Nightly-Job, ein
CI-Schritt — schlägt ein kleines Skript alles oben. Der Gewinn: Die AWS-SDKs
unmarshallen das typisierte JSON für dich: boto3s Resource-Interface und
der DynamoDBDocumentClient des JS-SDK liefern schlicht {"price": 2000}
statt {"price": {"N": "2000"}} (boto3s Resource-Interface macht „die
Datentypisierung implizit", laut
AWS-Python-Guide;
der JS-DocumentClient „konvertiert annotierte Antwortdaten in native
JavaScript-Typen", laut
@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})Zwei Entscheidungen bleiben bei dir, die das SDK dir nicht abnehmen kann:
wie du verschachtelte Maps/Listen zu Spalten plättest (die Zelle
JSON-enkodieren? die Schlüssel dot-pathen?) und was mit
Sparse-Attributen passiert (hier wird ein fehlender Schlüssel per
r.get(k) zur leeren Zelle). Und lass die LastEvaluatedKey-Schleife nicht
weg — ein einzelner scan()-Aufruf liefert nur die erste 1-MB-Seite, ohne
sie exportierst du also stillschweigend nur einen Teil der Tabelle.
Derselbe Vorbehalt wie bei Methode 2: Ein Full-Table-scan verbraucht auch
hier Lesekapazität und konkurriert mit Live-Traffic. Für eine große Tabelle
bevorzuge Methode 3 und
forme den Dump um.
Fallstricke: DynamoDB-JSON vs. flaches CSV
Egal welche Methode du wählst, dieselbe Handvoll Diskrepanzen zwischen DynamoDBs Datenmodell und einem flachen CSV wird dich beißen:
- Typ-Deskriptoren. Rohe API-/CLI-/S3-Export-Ausgabe verpackt jeden Wert
(
{"S": "..."},{"N": "123"}). Entweder packst du ihn über ein SDK aus oder entfernst den Deskriptor selbst. Der vollständige Satz istS,N,B,BOOL,NULL,M,L,SS,NS,BS— siehe DynamoDB-Datentypen. - Verschachtelte Maps und Listen (
M,L) können bis zu 32 Ebenen tief verschachteln (AWS-Docs: data types — Liste und Map „können ineinander verschachtelt werden, um komplexe Datenstrukturen bis zu 32 Ebenen tief darzustellen") und haben keine natürliche Einzelspalten-Form. Entscheide vorab: die Zelle JSON-enkodieren oder verschachtelte Schlüssel in dot-gepfadete Spalten auffalten (address.city). - Sets (
SS/NS/BS) sind ungeordnete Sammlungen, keine Skalare — AWS warnt: „die Reihenfolge der Werte innerhalb eines Sets bleibt nicht erhalten" (Datentypen) — plätte also zu einem getrennten String und verlasse dich nicht auf die Elementreihenfolge. - Sparse-Attribute. DynamoDB ist schemalos, zwei Items können also unterschiedliche Attribute haben. Es gibt keinen festen Spaltensatz; vereinige die Schlüssel über alle Items, sonst verrutschen Spalten. Das ist eine direkte Folge von Single-Table-Design, bei dem eine Tabelle mehrere Entity-Formen hält.
- Paginierung.
Scan(undQuery) liefern höchstens 1 MB pro Aufruf. Wenn du nicht überLastEvaluatedKeyschleifst, exportierst du stillschweigend nur die erste Seite. Siehe Paginierung. - Zahlenpräzision. DynamoDB-Zahlen tragen bis zu 38 Stellen Präzision und reisen als Strings (AWS-Docs: data types: „Zahlen können bis zu 38 Stellen Präzision haben"; „Alle Zahlen werden über das Netzwerk als Strings an DynamoDB gesendet"); Tabellenkalkulationen können lange Zahlen oder IDs in Floats zwingen und Stellen verlieren. Behalte sie als Text.
FAQ
Was ist der schnellste Weg, eine DynamoDB-Tabelle nach CSV zu exportieren? Eine GUI, die das Plätten für dich erledigt: Filtere in DynoTable die Tabelle, drücke ⌘⇧E, wähle CSV und einen Umfang — von den ausgewählten Zeilen bis zu jedem Item, das der Filter matcht, aus DynamoDB gestreamt. Typ-Deskriptoren und verschachtelte Werte werden automatisch behandelt.
Wie exportiere ich eine DynamoDB-Tabelle per AWS CLI nach CSV?
Scanne die Tabelle und forme die Ausgabe mit jq um (Methode 2):
aws dynamodb scan → jq, um den Typ-Deskriptor jedes Werts zu entfernen →
@csv. Es gibt kein DynamoDB-bewusstes --output csv, das Typ-Entfernen
machst du also immer selbst, und es bricht an verschachtelten Maps, Listen
und Sets.
Kann ich eine DynamoDB-Tabelle direkt aus AWS nach CSV exportieren?
Nicht in einem Schritt. Konsole und verwalteter S3-Export produzieren beide
DynamoDB-JSON oder Amazon Ion, nie CSV. Du brauchst immer einen
Konvertierungsschritt — CLI + jq, ein Skript, Athena/Glue über den S3-Dump
oder eine GUI, die das Plätten für dich erledigt.
Wie exportiere ich eine ganze DynamoDB-Tabelle, ohne die Produktion zu beeinträchtigen?
Nutze das Export-nach-S3-Feature (Methode 3). Es läuft asynchron und
verbraucht keine Lesekapazitätseinheiten, konkurriert also nicht mit
Live-Traffic — anders als ein Scan, der gegen den Durchsatz deiner Tabelle
gemessen wird
(AWS-Docs).
Es erfordert aktiviertes PITR und exportiert die volle Tabelle, keine
gefilterte Teilmenge.
Wie exportiere ich DynamoDB als CSV nach S3?
Der verwaltete Export schreibt nur DynamoDB-JSON / Ion nach S3, „nach CSV"
ist also ein zweiter Hop: Registriere das Export-Präfix als Athena- (oder
Glue-)Tabelle und schreibe CSV aus einem SELECT. Es gibt kein
--export-format CSV.
Wie exportiere ich DynamoDB nach Excel?
Exportiere zuerst nach CSV (jede Methode oben) und öffne das CSV dann in
Excel — behalte lange numerische IDs als Text, damit sie nicht in Floats
gezwungen werden. Es gibt keinen direkten .xlsx-Export aus DynamoDB;
DynoTable speichert die aktuelle Ansicht direkt als
spreadsheet-taugliches CSV.
Warum hat mein exportiertes JSON überall {"S": ...} und {"N": ...}?
Das ist DynamoDBs Wire-Format — jeder Wert trägt
einen Typ-Deskriptor. Unmarshalle es mit einem SDK, dem
DynamoDB-JSON-Konverter oder einer GUI,
bevor du CSV schreibst. Das Wire-Format ist dasselbe, egal ob die Daten aus
der API, der CLI oder dem S3-Export kamen.
Durchstöbere, filtere und exportiere deine eigenen Tabellen nach CSV mit DynoTable, oder packe zuerst eine Probe DynamoDB-JSON im JSON-Konverter aus.


