Pemula11 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 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": 3 polos) 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.
Dialog ekspor DynoTable: format (CSV / JSON / NDJSON), cakupan dari seleksi hingga seluruh kecocokan filter, dan tujuan clipboard atau file.
Dialog ekspor DynoTable: format (CSV / JSON / NDJSON), cakupan dari seleksi hingga seluruh kecocokan filter, dan tujuan clipboard atau file.

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

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

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

Diperbarui