Pemula10 menit baca

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.csv

Jebakannya 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; @csv tersedak, 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 price dan 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_JSON

Satu 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 adalah S, 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 (dan Query) mengembalikan paling banyak 1 MB per panggilan. Jika kamu tidak melooping LastEvaluatedKey kamu 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 scanjq 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.

Diperbarui