Cara Mengekspor Tabel DynamoDB ke CSV (4 Cara)
DynamoDB tidak punya tombol "export to CSV" bawaan. Setiap nilai kembali
terbungkus dalam JSON marshalled milik DynamoDB —
{"S": "..."}, {"N": "123"}, {"M": {...}} — dan sebuah tabel bisa memuat
map, list, dan set bersarang tanpa representasi kolom-datar yang jelas. Jadi
"ekspor DynamoDB ke CSV" sebenarnya dua masalah: keluarkan Item-nya, lalu
ratakan JSON bertipe itu menjadi baris. Baik console maupun managed
export tidak melakukan langkah kedua untuk Anda.
Panduan ini dimulai dengan cara yang melakukan kedua langkah itu untuk Anda, lalu membahas tiga rute tooling AWS dan kapan masing-masing menjadi pilihan yang tepat.
Bagaimana cara mengekspor tabel DynamoDB ke CSV?
Cara tercepat: buka tabelnya di DynoTable, filter ke baris yang
Anda inginkan, dan ekspor hasilnya ke CSV dalam satu klik — deskriptor tipe
dibuka dan nilai bersarang diratakan untuk Anda
(Metode 1). Membangunnya dari
tooling AWS sebagai gantinya: scan dengan CLI dan bentuk-ulang dengan jq
untuk tabel kecil (Metode 2), gunakan managed
export S3 untuk tabel besar
(Metode 3), atau tulis skrip
pendek ketika Anda butuh pembentukan custom
(Metode 4).
- CSV terfilter / terbentuk (subset kolom, hanya sebagian Item): ekspor GUI (Metode 1) atau sebuah skrip. Managed export S3 memberi Anda seluruh tabel, tanpa filter.
- Tabel kecil, ad-hoc, hanya-terminal: AWS CLI
scan+jq(Metode 2). Aman sampai atribut bersarang muncul. - Tabel besar (GB+): ekspor DynamoDB ke S3 (Metode 3), lalu konversi dump-nya. Ia berjalan asinkron dan mengonsumsi nol read capacity — tetapi outputnya DynamoDB JSON, bukan CSV.
Metode 1: ekspor satu-klik di DynoTable
DynoTable memperlakukan ekspor sebagai bagian dari menjelajah: jalankan atau filter sebuah query, tekan ⌘⇧E (atau tombol Export di toolbar tab), dan pilih apa yang keluar:
- Format: CSV (satu baris per Item, dengan header — set diserialkan
sebagai array JSON di dalam sebuah sel), JSON, dan NDJSON.
JSON/NDJSON keluar dalam bentuk unmarshalled (
"count": 3polos) atau DynamoDB-JSON marshalled ketika Anda butuh round-trip lossless yang mempertahankan angka besar. - Cakupan: baris yang sedang dimuat, hanya seleksi Anda, atau seluruh kecocokan filter — setiap Item yang cocok dengan query Anda, di-stream langsung dari DynamoDB alih-alih hanya yang ada di layar. Yang terakhir itu adalah ekspor terfilter yang tidak bisa dilakukan snapshot S3 terkelola.
- Tujuan: clipboard atau file. Untuk ambilan sekali-jalan, klik-kanan sebuah baris dan Copy as… menaruh CSV, JSON, NDJSON, atau DynamoDB-JSON langsung di clipboard, tanpa dialog.

Masalah-masalah peratakan yang mematahkan rute DIY di bawah sudah ditangani: deskriptor tipe dibuka, map dan list bersarang diratakan, dan kolom yang diganti nama mengalir ke header CSV. Ekspor besar melepaskan diri dan berjalan di latar belakang — di-stream ke disk baris demi baris, bertahan melewati pergantian tab dan bahkan reload aplikasi — jadi ekspor multi-gigabyte tidak pernah harus muat di memori.
Ia adalah klien DynamoDB desktop, alat yang sama yang sudah Anda pakai untuk menjelajahi tabel; lihat perbandingannya dengan GUI DynamoDB lain. Kapan Anda tidak akan memakainya? Ketika ekspornya harus berjalan tanpa pengawasan di sebuah pipeline — untuk itulah rute skrip (Metode 4) ada.
Metode 2: scan AWS CLI + jq
Untuk tabel kecil Anda bisa men-scan-nya dan membentuk-ulang outputnya dengan
jq. Sebuah Scan membaca setiap Item di tabel dan mengembalikannya
dalam halaman hingga 1 MB; CLI mengikuti paginasinya untuk Anda secara
otomatis
(Dokumen AWS: Scanning tables).
aws dynamodb scan --table-name MyTable --output json \
| jq -r '.Items[] | [.id.S, .name.S, .price.N] | @csv' \
> out.csvJebakannya ada di baris jq itu: Anda harus menulis-tangan .id.S,
.name.S, .price.N — menjangkau melewati deskriptor tipe setiap
atribut (S, N, B, BOOL, M, L, SS, NS, BS) untuk mendapatkan
nilai mentahnya. Itu masih terkelola untuk tabel datar dengan tiga kolom
string. Ia berantakan begitu Anda punya:
- Map/list bersarang —
{"M": {...}}atau{"L": [...]}tidak punya satu kolom untuk diratakan;@csvtersedak, atau Anda meng-encode-JSON selnya dengan tangan. - Set —
{"SS": ["a","b"]}adalah array, bukan skalar. - Atribut sparse — DynamoDB schemaless, jadi Item A bisa punya
pricedan Item B tidak. Daftar kolom tetap Anda diam-diam menjatuhkan atau menggeser kolom.
Juga tidak ada --output csv sama sekali — format output CLI adalah json,
yaml, text, table, dan off, tak satu pun memahami tipe DynamoDB. Jadi
Anda tetap butuh jq (atau skrip) untuk melucuti tag tipenya. Itulah alasan
inti kenapa "ekspor tabel DynamoDB ke CSV lewat AWS CLI" tidak pernah menjadi
satu-baris melewati kasus trivial.
Untuk mengekspor seluruh tabel yang lebih besar dengan cara ini tanpa
memakan waktu seharian, paralelkan scan-nya dengan --segment /
--total-segments
(dokumen AWS: Parallel scan —
DynamoDB "menetapkan item ke segmen dengan menerapkan fungsi hash pada partition
key tiap item", jadi segmen bisa tidak merata), dan baca
paginasi agar Anda tidak berhenti di halaman 1 MB
pertama.
Metode 3: ekspor DynamoDB ke S3 (tabel besar)
Untuk tabel berukuran sungguhan, ekspor terkelola ke Amazon S3 adalah
alat yang tepat. Ia mengekspor sebuah snapshot dari titik mana pun dalam
jendela point-in-time recovery (PITR) Anda — jadi PITR harus
diaktifkan di tabelnya lebih dulu, atau ekspornya gagal dengan
PointInTimeRecoveryUnavailableException —
berjalan asinkron, dan
tidak mengonsumsi read capacity unit, sehingga berdampak nol pada
throughput atau ketersediaan tabel Anda (dokumen AWS:
"ekspor bersifat asinkron, tidak memakan read capacity unit (RCU), dan tidak
berdampak pada performa maupun ketersediaan tabel"; "Anda perlu mengaktifkan PITR
di tabel Anda untuk memakai fungsi ekspor"). Ini juga yang dipicu aksi Exports to S3
di console di balik layar: console hanyalah front end untuk API yang sama,
jadi ia membawa persyaratan PITR yang sama dan output JSON yang sama.
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_JSONSatu-satunya jebakan: ekspor S3 tidak menghasilkan CSV. Ia menulis
DynamoDB JSON atau Amazon Ion saja, sebagai file ter-gzip dalam
format JSON-lines (satu Item per baris), plus file
manifest (dokumen AWS: format keluaran ekspor —
file data ditulis sebagai .json.gz, "the format is JSON lines", di samping
manifest-summary.json / manifest-files.json). Anda tetap butuh langkah
konversi setelahnya:
- Athena / Glue membaca DynamoDB JSON hasil ekspor secara langsung —
arahkan sebuah tabel ke prefiks S3-nya, lalu tulis CSV dari sebuah
SELECT(inilah pipeline lazim "ekspor DynamoDB ke S3 lalu ke CSV"). AWS mencatat bahwa "many AWS services, such as Athena and AWS Glue, will parse this format automatically" (format keluaran ekspor). - Buat sendiri — dekompres file
.gz-nya, parse setiap baris JSON, dan ratakan (masalah peratakan yang sama dengan setiap metode lain).
Ia juga snapshot seluruh-tabel: tidak ada filter sisi-server untuk mengekspor hanya sebagian Item. Jika Anda butuh subset, Anda memfilter setelahnya di Athena, atau memakai GUI (Metode 1) / skrip sebagai gantinya.
Metode 4: skrip cepat (boto3 / Node)
Ketika ekspornya harus berjalan tanpa pengawasan — job malam hari,
langkah CI — sebuah skrip kecil mengalahkan semua di atas. Kemenangannya
adalah AWS SDK meng-unmarshall JSON bertipe itu untuk Anda: antarmuka
resource boto3 dan DynamoDBDocumentClient milik SDK JS mengembalikan
{"price": 2000} polos alih-alih {"price": {"N": "2000"}} (antarmuka
resource boto3 membuat "the data typing
implicit", per
panduan Python AWS;
DocumentClient JS "converts annotated response data to native JavaScript types",
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})Anda tetap memiliki dua keputusan yang tidak bisa dibuat SDK untuk Anda: cara
meratakan map/list bersarang menjadi kolom (meng-encode-JSON selnya?
kolom ber-dot-path?), dan apa yang dilakukan dengan atribut sparse (di
sini key yang hilang menjadi sel kosong lewat r.get(k)). Dan jangan buang
loop LastEvaluatedKey-nya — satu panggilan scan() mengembalikan hanya
halaman 1 MB pertama, jadi tanpanya Anda diam-diam mengekspor sebagian tabel
saja.
Peringatan yang sama dengan Metode 2: scan full-table di sini tetap
mengonsumsi read capacity dan bersaing dengan trafik live. Untuk tabel besar,
pilih Metode 3 dan
bentuk-ulang dump-nya.
Jebakan: DynamoDB JSON vs CSV datar
Metode mana pun yang Anda pilih, segelintir ketidakcocokan yang sama antara model data DynamoDB dan CSV datar akan menggigit Anda:
- Deskriptor tipe. Output mentah API / CLI / ekspor-S3 membungkus setiap
nilai (
{"S": "..."},{"N": "123"}). Anda membukanya lewat SDK atau melucuti deskriptornya sendiri. Set lengkapnya adalahS,N,B,BOOL,NULL,M,L,SS,NS,BS— lihat tipe data DynamoDB. - Map dan list bersarang (
M,L) bisa bersarang hingga 32 level (dokumen AWS: data types — list dan map "can be nested within each other, to represent complex data structures up to 32 levels deep") dan tidak punya bentuk satu-kolom yang alami. Putuskan di muka: encode-JSON selnya, atau ledakkan key bersarang menjadi kolom ber-dot-path (address.city). - Set (
SS/NS/BS) adalah koleksi tak-berurut, bukan skalar — AWS memperingatkan "the order of the values within a set is not preserved" (data types) — jadi ratakan menjadi string berdelimiter dan jangan mengandalkan urutan elemen. - Atribut sparse. DynamoDB schemaless, jadi dua Item bisa punya atribut yang berbeda. Tidak ada set kolom yang tetap; gabungkan (union) key dari semua Item atau kolom akan bergeser. Ini konsekuensi langsung dari single-table design, di mana satu tabel memuat beberapa bentuk entity.
- Paginasi.
Scan(danQuery) mengembalikan paling banyak 1 MB per panggilan. Jika Anda tidak me-loopLastEvaluatedKey, Anda diam-diam mengekspor halaman pertama saja. Lihat paginasi. - Presisi angka. Angka DynamoDB membawa presisi hingga 38 digit dan berpindah sebagai string (dokumen AWS: data types: "angka bisa memiliki presisi hingga 38 digit"; "semua angka dikirim melalui jaringan ke DynamoDB sebagai string"); perangkat lunak spreadsheet bisa memaksa angka panjang atau ID menjadi float dan kehilangan digit. Pertahankan mereka sebagai teks.
FAQ
Apa cara tercepat mengekspor tabel DynamoDB ke CSV? GUI yang melakukan peratakannya untuk Anda: di DynoTable, filter tabelnya, tekan ⌘⇧E, pilih CSV, dan pilih cakupan — dari baris terpilih hingga setiap Item yang cocok dengan filter, di-stream dari DynamoDB. Deskriptor tipe dan nilai bersarang ditangani otomatis.
Bagaimana cara mengekspor tabel DynamoDB ke CSV dengan AWS CLI?
Scan tabelnya dan bentuk-ulang outputnya dengan jq (Metode 2):
aws dynamodb scan → jq untuk melucuti deskriptor tipe setiap nilai →
@csv. Tidak ada --output csv yang paham DynamoDB, jadi Anda selalu
melakukan pelucutan tipe sendiri, dan ia patah pada map, list, dan set
bersarang.
Bisakah saya mengekspor tabel DynamoDB langsung ke CSV dari AWS?
Tidak dalam satu langkah. Console dan managed export S3 sama-sama
menghasilkan DynamoDB JSON atau Amazon Ion, tidak pernah CSV. Anda selalu
butuh langkah konversi — CLI + jq, sebuah skrip, Athena/Glue di atas dump
S3, atau GUI yang melakukan peratakannya untuk Anda.
Bagaimana mengekspor seluruh tabel DynamoDB tanpa memengaruhi produksi?
Gunakan fitur ekspor ke S3 (Metode 3). Ia berjalan asinkron dan
mengonsumsi nol read capacity unit, jadi ia tidak bersaing dengan trafik
live — tidak seperti Scan, yang dimetering terhadap throughput tabel Anda
(dokumen AWS).
Ia mensyaratkan PITR diaktifkan dan mengekspor seluruh tabel, bukan subset
terfilter.
Bagaimana cara mengekspor DynamoDB ke S3 sebagai CSV?
Ekspor terkelola hanya menulis DynamoDB JSON / Ion ke S3, jadi "ke CSV"
adalah lompatan kedua: daftarkan prefiks ekspornya sebagai tabel Athena (atau
Glue) dan tulis CSV dari sebuah SELECT. Tidak ada --export-format CSV.
Bagaimana cara mengekspor DynamoDB ke Excel?
Ekspor ke CSV dulu (metode mana pun di atas), lalu buka CSV-nya di Excel —
dengan menjaga ID numerik panjang sebagai teks agar tidak dipaksa menjadi
float. Tidak ada ekspor .xlsx langsung dari DynamoDB;
DynoTable menyimpan tampilan saat ini langsung ke CSV yang siap
untuk spreadsheet.
Kenapa JSON hasil ekspor saya penuh {"S": ...} dan {"N": ...}?
Itu format kabel milik DynamoDB — setiap nilai
diberi tag deskriptor tipe. Unmarshall dengan sebuah SDK,
konverter DynamoDB JSON, atau sebuah GUI
sebelum menulis CSV. Format kabelnya sama entah datanya datang dari API, CLI,
atau ekspor S3.
Jelajahi, filter, dan ekspor tabel Anda sendiri ke CSV dengan DynoTable, atau buka dulu sampel DynamoDB JSON di konverter JSON.


