Cara Mengekspor Tabel DynamoDB ke CSV (4 Cara)
DynamoDB tidak punya tombol "export to CSV" bawaan. Setiap nilai kembali terbungkus
dalam JSON marshalled DynamoDB — {"S": "..."},
{"N": "123"}, {"M": {...}} — dan sebuah tabel dapat menyimpan 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 menjadi
baris. Baik konsol maupun ekspor terkelola tidak melakukan langkah kedua untukmu.
Panduan ini memeringkat empat pendekatan berdasarkan ukuran tabel dan seberapa banyak nesting yang dibawa Item-mu.
Bagaimana cara mengekspor tabel DynamoDB ke CSV?
DynamoDB tidak punya ekspor CSV bawaan, jadi kamu perlu memindai atau membuat snapshot tabel, lalu meratakan JSON bertipe-nya menjadi baris. Untuk tabel kecil, gunakan AWS CLI scan + jq atau skrip singkat; untuk tabel besar, ekspor ke S3 lalu konversi; untuk CSV terfilter yang siap pakai, gunakan GUI seperti DynoTable.
- Tabel kecil, ad-hoc: AWS CLI
scan+jq, atau skrip 20 baris (Metode 1 / Metode 3). Cukup sampai atribut bersarang muncul. - Tabel besar (GB+): ekspor DynamoDB ke S3 (Metode 2), lalu konversi dump-nya. Berjalan secara asinkron dan tidak memakai read capacity — tetapi menghasilkan DynamoDB JSON, bukan CSV.
- CSV terfilter / dibentuk (subset kolom, hanya sebagian item): ekspor GUI atau skrip. Ekspor S3 terkelola memberimu seluruh tabel, tanpa filter.
Metode 1: AWS CLI scan + jq
Untuk tabel kecil kamu bisa memindainya dan membentuk ulang output dengan jq. Sebuah
Scan membaca setiap item dalam tabel dan mengembalikannya dalam halaman hingga
1 MB; CLI mengikuti paginasi untukmu 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: kamu harus menulis tangan .id.S, .name.S,
.price.N — menjangkau melewati deskriptor tipe tiap atribut (S, N, B,
BOOL, M, L, SS, NS, BS) untuk mendapat nilai mentahnya. Itu masih terkelola
untuk tabel datar dengan tiga kolom string. Ini runtuh begitu kamu punya:
- Map/list bersarang —
{"M": {...}}atau{"L": [...]}tidak punya kolom tunggal untuk diratakan;@csvtersedak, atau kamu meng-encode JSON sel itu dengan tangan. - Set —
{"SS": ["a","b"]}adalah array, bukan skalar. - Atribut jarang (sparse) — DynamoDB schemaless, jadi item A mungkin punya
pricedan item B mungkin tidak. Daftar kolom tetapmu diam-diam menjatuhkan atau salah-jajar kolom.
Juga tidak ada --output csv yang memahami tipe DynamoDB. Output csv CLI meratakan
respons mentah, lengkap dengan deskriptornya — jadi kamu tetap butuh jq (atau skrip)
untuk melepas tag tipe. Itu alasan inti mengapa "ekspor tabel DynamoDB ke CSV via AWS
CLI" tidak pernah jadi satu baris melampaui kasus sepele.
Untuk mengekspor seluruh tabel yang lebih besar dengan cara ini tanpa memakan seharian,
paralelkan scan dengan --segment / --total-segments
(dokumen AWS: Parallel scan —
DynamoDB "assigns items to segments by applying a hash function to each item's
partition key", jadi segmen bisa tidak merata), dan baca
paginasi supaya kamu tidak berhenti di halaman 1 MB pertama.
Metode 2: ekspor DynamoDB ke S3 (tabel besar)
Untuk tabel berukuran nyata, ekspor terkelola ke Amazon S3 adalah alat yang tepat. Ia mengekspor snapshot dari titik mana pun dalam jendela point-in-time recovery (PITR) — jadi PITR harus diaktifkan pada tabel dulu — berjalan secara asinkron, dan tidak memakai read capacity unit, sehingga tidak berdampak pada throughput atau ketersediaan tabelmu (dokumen AWS: "Exports are asynchronous, they don't consume read capacity units (RCUs) and have no impact on table performance and availability"; "You need to enable PITR on your table to use the export functionality"). Ini juga yang dipicu aksi Exports to S3 konsol di balik layar: konsol hanyalah front end untuk API yang sama, jadi 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 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 output ekspor —
file data ditulis sebagai .json.gz, "the format is JSON lines", di samping
manifest-summary.json / manifest-files.json). Kamu tetap butuh langkah konversi
setelahnya:
- Athena / Glue membaca DynamoDB JSON yang diekspor secara langsung — arahkan
sebuah tabel ke prefix S3, lalu tulis CSV dari sebuah
SELECT(ini pipeline "ekspor DynamoDB ke S3 lalu ke CSV" yang umum). AWS mencatat bahwa "many AWS services, such as Athena and AWS Glue, will parse this format automatically" (format output ekspor). - Buat sendiri — dekompres file
.gz, parse tiap baris JSON, dan ratakan (masalah perataan yang sama seperti setiap metode lain).
Ini juga snapshot seluruh tabel: tidak ada filter sisi server untuk mengekspor hanya sebagian item. Jika kamu butuh subset, kamu memfilter setelahnya di Athena, atau memakai skrip / GUI sebagai gantinya.
Metode 3: skrip cepat (boto3 / Node)
Saat kamu butuh CSV yang dibentuk — kolom spesifik, subset terfilter, penanganan
kustom untuk field bersarang — skrip kecil mengalahkan berkelahi dengan jq. Untungnya,
AWS SDK meng-unmarshall JSON bertipe untukmu: antarmuka resource boto3 dan
DynamoDBDocumentClient SDK JS mengembalikan {"price": 2000} biasa alih-alih
{"price": {"N": "2000"}} (antarmuka resource boto3 membuat "the data typing
implicit", per
panduan AWS Python;
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: # paginasi sampai akhir
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})Kamu tetap memegang dua keputusan yang tak bisa dibuat SDK untukmu: cara meratakan
map/list bersarang menjadi kolom (encode JSON sel itu? jalur titik untuk kuncinya?), dan
apa yang harus dilakukan dengan atribut sparse (di sini kunci yang hilang menjadi sel
kosong via r.get(k)). Dan jangan jatuhkan loop LastEvaluatedKey — satu panggilan
scan() hanya mengembalikan halaman 1 MB pertama, jadi tanpa itu kamu diam-diam
mengekspor sebagian tabel.
Peringatan yang sama seperti Metode 1: scan seluruh tabel di sini tetap memakai read
capacity dan bersaing dengan trafik live. Untuk tabel besar, lebih baik
Metode 2 dan bentuk ulang dump-nya.
Metode 4: ekspor satu klik di DynoTable
Rute skrip dan CLI bekerja, tapi kamu membangun ulang logika perataan dan paginasi yang sama setiap kali. DynoTable melakukannya untukmu: jalankan atau filter sebuah Query, lalu ekspor baris yang terlihat langsung ke CSV (atau Excel) — deskriptor tipe terbuka, map dan list bersarang diratakan, set ditangani, dan hanya item serta kolom yang benar-benar kamu mau di output.
Karena kamu mengekspor tampilan saat ini, kamu mendapat CSV terfilter/dibentuk yang tidak bisa diberikan snapshot seluruh tabel Metode 2 — tanpa menulis loop scan. Ini klien DynamoDB desktop, alat yang sudah kamu pakai untuk menjelajah tabel; lihat bagaimana ia dibandingkan dengan GUI DynamoDB lain.
Jebakan: DynamoDB JSON vs CSV datar
Metode apa pun yang kamu pilih, segelintir ketidaksesuaian yang sama antara model data DynamoDB dan CSV datar akan menggigitmu:
- Deskriptor tipe. Output API / CLI / ekspor-S3 mentah membungkus setiap nilai
(
{"S": "..."},{"N": "123"}). Kamu meng-unwrap-nya via SDK atau melepas deskriptornya sendiri. Set lengkapnya adalahS,N,B,BOOL,NULL,M,L,SS,NS,BS— lihat tipe data DynamoDB. - Map dan list bersarang (
M,L) dapat bersarang hingga 32 level dalam (dokumen AWS: tipe data — list dan map "can be nested within each other, to represent complex data structures up to 32 levels deep") dan tidak punya bentuk kolom tunggal alami. Putuskan di depan: encode JSON sel itu, atau pecah kunci bersarang menjadi kolom berjalur titik (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" (tipe data) — jadi ratakan menjadi string berdelimiter dan jangan bergantung pada urutan elemen. - Atribut sparse. DynamoDB schemaless, jadi dua item bisa punya atribut berbeda. Tidak ada set kolom tetap; gabungkan kunci di semua item atau kolom akan salah-jajar. Ini konsekuensi langsung dari single-table design, di mana satu tabel menampung beberapa bentuk entitas.
- Paginasi.
Scan(danQuery) mengembalikan paling banyak 1 MB per panggilan. Jika kamu tidak meloopingLastEvaluatedKeykamu akan diam-diam mengekspor hanya halaman pertama. Lihat paginasi. - Presisi angka. Angka DynamoDB membawa hingga 38 digit presisi dan bepergian sebagai string (dokumen AWS: tipe data: "Numbers can have up to 38 digits of precision"; "All numbers are sent across the network to DynamoDB as strings"); perangkat lunak spreadsheet mungkin memaksa angka atau ID panjang menjadi float dan kehilangan digit. Pertahankan sebagai teks.
FAQ
Bagaimana cara mengekspor tabel DynamoDB ke CSV dengan AWS CLI?
Scan tabel dan bentuk ulang output dengan jq (Metode 1): aws dynamodb scan →
jq untuk melepas deskriptor tipe tiap nilai → @csv. Tidak ada --output csv yang
sadar-DynamoDB, jadi kamu selalu melakukan pelepasan tipe sendiri, dan ini rusak pada
map, list, dan set bersarang.
Bisakah saya mengekspor tabel DynamoDB langsung ke CSV dari AWS?
Tidak dalam satu langkah. Konsol dan ekspor S3 terkelola sama-sama menghasilkan DynamoDB
JSON atau Amazon Ion, tidak pernah CSV. Kamu selalu butuh langkah konversi — CLI + jq,
sebuah skrip, Athena/Glue di atas dump S3, atau GUI yang melakukan perataan untukmu.
Bagaimana cara mengekspor seluruh tabel DynamoDB tanpa memengaruhi produksi?
Gunakan fitur ekspor ke S3 (Metode 2). Ia berjalan asinkron dan memakai
nol read capacity unit, jadi tidak bersaing dengan trafik live — tidak seperti
Scan, yang dihitung terhadap throughput tabelmu
(dokumen AWS).
Ia membutuhkan 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 prefix ekspor 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 di Excel — menjaga ID numerik
panjang sebagai teks agar tidak dipaksa menjadi float. Tidak ada ekspor .xlsx langsung
dari DynamoDB; GUI seperti DynoTable dapat menyimpan tampilan saat ini
langsung ke CSV siap-spreadsheet.
Mengapa JSON yang saya ekspor punya {"S": ...} dan {"N": ...} di mana-mana?
Itu format wire marshalled DynamoDB — setiap nilai ditandai dengan deskriptor tipe.
Unmarshall dengan SDK, konverter DynamoDB JSON, atau
GUI sebelum menulis CSV. Format wire-nya sama baik data datang dari API, CLI, maupun
ekspor S3.
Telusuri, filter, dan ekspor tabelmu sendiri ke CSV dengan DynoTable, atau buka sampel DynamoDB JSON di konverter JSON dulu.