Başlangıç10 dakikalık okuma

Bir DynamoDB Tablosu CSV'ye Nasıl Dışa Aktarılır (4 Yol)

DynamoDB'nin yerel bir "CSV'ye dışa aktar" düğmesi yoktur. Her değer DynamoDB'nin marshalled JSON'una sarılı olarak geri gelir — {"S": "..."}, {"N": "123"}, {"M": {...}} — ve bir tablo, açık bir düz sütun gösterimi olmayan iç içe haritalar, listeler ve kümeler tutabilir. Yani "DynamoDB'yi CSV'ye dışa aktarmak" aslında iki problemdir: öğeleri dışarı çıkarın, sonra türlü JSON'u satırlara düzleştirin. İkinci adımı ne konsol ne de yönetilen dışa aktarım sizin için yapar.

Bu kılavuz dört yaklaşımı tablo boyutuna ve öğelerinizin ne kadar iç içelik taşıdığına göre sıralar.

Bir DynamoDB tablosunu CSV'ye nasıl dışa aktarırım?

DynamoDB'nin yerel CSV dışa aktarımı yoktur; tabloyu taramanız veya anlık görüntüsünü almanız, ardından türlü JSON'u satırlara düzleştirmeniz gerekir. Küçük tablolar için AWS CLI scan + jq ya da kısa bir komut dosyası kullanın; büyük tablolar için S3'e dışa aktarıp dönüştürün; filtrelenmiş, kullanıma hazır CSV için DynoTable gibi bir GUI tercih edin.

  • Küçük tablo, geçici: AWS CLI scan + jq ya da 20 satırlık bir komut dosyası (Yöntem 1 / Yöntem 3). İç içe öznitelikler ortaya çıkana kadar iyidir.
  • Büyük tablo (GB+): DynamoDB'yi S3'e dışa aktarma (Yöntem 2), sonra dökümü dönüştürün. Eşzamansız çalışır ve okuma kapasitesi tüketmez — ama CSV değil, DynamoDB JSON çıktısı verir.
  • Filtrelenmiş / şekillendirilmiş CSV (sütunların bir alt kümesi, yalnızca bazı öğeler): bir GUI dışa aktarımı ya da bir komut dosyası. Yönetilen S3 dışa aktarımı size tüm tabloyu, filtrelenmemiş olarak verir.

Yöntem 1: AWS CLI scan + jq

Küçük bir tablo için onu tarayıp çıktıyı jq ile yeniden şekillendirebilirsiniz. Bir Scan tablodaki her öğeyi okur ve 1 MB'a kadar sayfalar halinde döndürür; CLI sayfalandırmayı sizin için otomatik olarak takip eder (AWS belgeleri: Tabloları tarama).

aws dynamodb scan --table-name MyTable --output json \
  | jq -r '.Items[] | [.id.S, .name.S, .price.N] | @csv' \
  > out.csv

Tuzak o jq satırındadır: ham değeri almak için her özniteliğin tür tanımlayıcısının (S, N, B, BOOL, M, L, SS, NS, BS) ötesine uzanarak .id.S, .name.S, .price.N'yi elle yazmanız gerekir. Bu, üç dize sütunlu düz bir tablo için yönetilebilir. Şunlara sahip olduğunuz anda dağılır:

  • İç içe haritalar/listeler{"M": {...}} ya da {"L": [...]} düzleştirilecek tek bir sütuna sahip değildir; @csv tıkanır ya da hücreyi elle JSON olarak kodlarsınız.
  • Kümeler{"SS": ["a","b"]} bir skaler değil, bir dizidir.
  • Seyrek öznitelikler — DynamoDB şemasızdır, bu yüzden A öğesinin bir price'ı olabilir ve B öğesinin olmayabilir. Sabit sütun listeniz sessizce sütunları düşürür veya yanlış hizalar.

Ayrıca DynamoDB türlerini anlayan bir --output csv yoktur. CLI'nin csv çıktısı ham yanıtı, tanımlayıcılar ve tümüyle düzleştirir — yani tür etiketlerini soymak için yine jq'ya (ya da bir komut dosyasına) ihtiyacınız olur. "AWS CLI ile DynamoDB tablosunu CSV'ye dışa aktarmanın" önemsiz durumun ötesinde asla bir tek satır olmamasının temel nedeni budur.

Daha büyük bir tablonun tamamını bütün gün sürmeden bu şekilde dışa aktarmak için, taramayı --segment / --total-segments ile paralelleştirin (AWS belgeleri: Paralel tarama — DynamoDB "her öğenin bölüm anahtarına bir karma işlevi uygulayarak öğeleri segmentlere atar", böylece segmentler dengesiz olabilir) ve ilk 1 MB sayfasında durmamak için sayfalandırma bölümünü okuyun.

Yöntem 2: DynamoDB'yi S3'e dışa aktarma (büyük tablolar)

Gerçekten herhangi bir boyuttaki tablolar için, yönetilen Amazon S3'e dışa aktarma doğru araçtır. Belirli zamana kurtarma (PITR) pencerenizdeki herhangi bir noktadan bir anlık görüntüyü dışa aktarır — bu yüzden önce tabloda PITR etkin olmalıdıreşzamansız çalışır ve hiçbir okuma kapasite birimi tüketmez, böylece tablonuzun verim veya kullanılabilirliği üzerinde sıfır etkisi vardır (AWS belgeleri: "Dışa aktarmalar eşzamansızdır, okuma kapasite birimi (RCU) tüketmezler ve tablo performansı ile kullanılabilirliği üzerinde etkisi yoktur"; "Dışa aktarma işlevselliğini kullanmak için tablonuzda PITR'yi etkinleştirmeniz gerekir"). Bu aynı zamanda konsolun S3'e Dışa Aktarmalar eyleminin kaputun altında tetiklediği şeydir: konsol aynı API için yalnızca bir ön yüzdür, bu yüzden aynı PITR gereksinimini ve aynı JSON çıktısını taşır.

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

Tek tuzak: S3 dışa aktarımı CSV çıktısı vermez. Yalnızca DynamoDB JSON ya da Amazon Ion yazar, gzip'lenmiş dosyalar olarak JSON-satırları biçiminde (satır başına bir öğe), artı manifest dosyaları (AWS belgeleri: dışa aktarma çıktı biçimi — veri dosyaları .json.gz olarak yazılır, "biçim JSON satırlarıdır", manifest-summary.json / manifest-files.json ile birlikte). Sonradan yine bir dönüştürme adımına ihtiyacınız vardır:

  • Athena / Glue dışa aktarılan DynamoDB JSON'u doğrudan okur — bir tabloyu S3 ön ekine yöneltin, sonra bir SELECT'ten CSV yazın (bu, olağan "DynamoDB'yi S3'e sonra CSV'ye dışa aktar" boru hattıdır). AWS, "Athena ve AWS Glue gibi birçok AWS hizmetinin bu biçimi otomatik olarak ayrıştıracağını" belirtir (dışa aktarma çıktı biçimi).
  • Kendiniz yapın.gz dosyalarını açın, her JSON satırını ayrıştırın ve düzleştirin (diğer her yöntemle aynı düzleştirme sorunu).

Ayrıca bir tam tablo anlık görüntüsüdür: yalnızca bazı öğeleri dışa aktarmak için sunucu tarafı filtre yoktur. Bir alt küme isterseniz, ya sonradan Athena'da filtrelersiniz ya da bunun yerine bir komut dosyası / GUI kullanırsınız.

Yöntem 3: hızlı bir komut dosyası (boto3 / Node)

Şekillendirilmiş bir CSV'ye ihtiyacınız olduğunda — belirli sütunlar, filtrelenmiş bir alt küme, iç içe alanlar için özel işleme — küçük bir komut dosyası jq ile boğuşmayı yener. Kazanç, AWS SDK'larının türlü JSON'u sizin için unmarshall etmesidir: boto3'ün kaynak arayüzü ve JS SDK'nın DynamoDBDocumentClient'i {"price": {"N": "2000"}} yerine düz {"price": 2000} döndürür (boto3'ün kaynak arayüzü "veri tiplemesini örtük" hale getirir, AWS Python kılavuzuna göre; JS DocumentClient "açıklamalı yanıt verisini yerel JavaScript türlerine dönüştürür", @aws-sdk/lib-dynamodb'ye göre).

import boto3, csv

table = boto3.resource("dynamodb").Table("MyTable")
rows, resp = [], table.scan()
rows += resp["Items"]
while "LastEvaluatedKey" in resp:                  # sona kadar sayfalandır
    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})

SDK'nın sizin için karar veremeyeceği iki kararın yine sizde olduğu kalır: iç içe haritaları/listeleri sütunlara nasıl düzleştireceğiniz (hücreyi JSON olarak mı kodlamalı? anahtarları noktayla yolla mı?) ve seyrek özniteliklerle ne yapacağınız (burada eksik bir anahtar r.get(k) aracılığıyla boş bir hücre olur). Ve LastEvaluatedKey döngüsünü düşürmeyin — tek bir scan() çağrısı yalnızca ilk 1 MB sayfasını döndürür, bu yüzden o olmadan tablonun bir kısmını sessizce dışa aktarırsınız.

Yöntem 1 ile aynı uyarı: buradaki bir tam tablo scan'i yine okuma kapasitesi tüketir ve canlı trafikle rekabet eder. Büyük bir tablo için Yöntem 2'yi tercih edin ve dökümü yeniden şekillendirin.

Yöntem 4: DynoTable'da tek tıkla dışa aktarım

Komut dosyası ve CLI yolları işe yarar, ama aynı düzleştirme ve sayfalandırma mantığını her seferinde yeniden kurarsınız. DynoTable bunu sizin için yapar: bir sorgu çalıştırın veya filtreleyin, sonra görünür satırları doğrudan CSV'ye (ya da Excel'e) dışa aktarın — tür tanımlayıcıları açılmış, iç içe haritalar ve listeler düzleştirilmiş, kümeler işlenmiş ve çıktıda yalnızca gerçekten istediğiniz öğeler ve sütunlar.

Geçerli görünümü dışa aktardığınız için, Yöntem 2'nin tam tablo anlık görüntüsünün veremediği filtrelenmiş/şekillendirilmiş CSV'yi elde edersiniz — bir tarama döngüsü yazmadan. Bu, tabloya göz atmak için zaten kullandığınız aynı araç olan bir masaüstü DynamoDB istemcisidir; diğer DynamoDB GUI'leriyle nasıl karşılaştırıldığına bakın.

Tuzaklar: DynamoDB JSON vs düz CSV

Hangi yöntemi seçerseniz seçin, DynamoDB'nin veri modeli ile düz bir CSV arasındaki aynı bir avuç uyumsuzluk sizi ısıracaktır:

  • Tür tanımlayıcıları. Ham API / CLI / S3 dışa aktarma çıktısı her değeri sarar ({"S": "..."}, {"N": "123"}). Onu ya bir SDK aracılığıyla açarsınız ya da tanımlayıcıyı kendiniz soyarsınız. Tam küme S, N, B, BOOL, NULL, M, L, SS, NS, BS'dir — bkz. DynamoDB veri türleri.
  • İç içe haritalar ve listeler (M, L) 32 seviye derinliğe kadar iç içe geçebilir (AWS belgeleri: veri türleri — liste ve harita "karmaşık veri yapılarını temsil etmek için 32 seviye derinliğe kadar birbirinin içine yerleştirilebilir") ve doğal bir tek sütun biçimi yoktur. Önceden karar verin: hücreyi JSON olarak kodlayın ya da iç içe anahtarları noktayla yollanmış sütunlara açın (address.city).
  • Kümeler (SS/NS/BS) skaler değil, sırasız koleksiyonlardır — AWS "bir kümedeki değerlerin sırası korunmaz" diye uyarır (veri türleri) — bu yüzden sınırlandırılmış bir dizeye düzleştirin ve öğe sırasına güvenmeyin.
  • Seyrek öznitelikler. DynamoDB şemasızdır, bu yüzden iki öğe farklı özniteliklere sahip olabilir. Sabit bir sütun kümesi yoktur; tüm öğeler genelinde anahtarları birleştirin yoksa sütunlar yanlış hizalanır. Bu, bir tablonun birkaç varlık şeklini tuttuğu tek tablo tasarımının doğrudan bir sonucudur.
  • Sayfalandırma. Scan (ve Query) çağrı başına en fazla 1 MB döndürür. LastEvaluatedKey üzerinde döngü yapmazsanız yalnızca ilk sayfayı sessizce dışa aktarırsınız. Bkz. sayfalandırma.
  • Sayı hassasiyeti. DynamoDB sayıları 38 basamağa kadar hassasiyet taşır ve dizeler olarak seyahat eder (AWS belgeleri: veri türleri: "Sayılar 38 basamağa kadar hassasiyete sahip olabilir"; "Tüm sayılar ağ üzerinden DynamoDB'ye dizeler olarak gönderilir"); elektronik tablo yazılımı uzun sayıları veya kimlikleri kayan noktalara zorlayıp basamak kaybedebilir. Onları metin olarak tutun.

SSS

Bir DynamoDB tablosunu AWS CLI ile CSV'ye nasıl dışa aktarırım? Tabloyu tarayın ve çıktıyı jq ile yeniden şekillendirin (Yöntem 1): aws dynamodb scan → her değerin tür tanımlayıcısını soymak için jq@csv. DynamoDB'nin farkında olan bir --output csv yoktur, bu yüzden tür soyma işini her zaman kendiniz yaparsınız ve iç içe haritalarda, listelerde ve kümelerde bozulur.

Bir DynamoDB tablosunu AWS'den doğrudan CSV'ye dışa aktarabilir miyim? Tek adımda değil. Konsol ve yönetilen S3 dışa aktarımının her ikisi de DynamoDB JSON veya Amazon Ion üretir, asla CSV değil. Her zaman bir dönüştürme adımına ihtiyacınız vardır — CLI + jq, bir komut dosyası, S3 dökümü üzerinde Athena/Glue ya da düzleştirmeyi sizin için yapan bir GUI.

Üretimi etkilemeden tüm bir DynamoDB tablosunu nasıl dışa aktarırım? S3'e dışa aktarma özelliğini kullanın (Yöntem 2). Eşzamansız çalışır ve hiçbir okuma kapasite birimi tüketmez, bu yüzden canlı trafikle rekabet etmez — tablonuzun verimi üzerinden ölçülen bir Scan'in aksine (AWS belgeleri). PITR'nin etkin olmasını gerektirir ve filtrelenmiş bir alt kümeyi değil, tam tabloyu dışa aktarır.

DynamoDB'yi S3'e CSV olarak nasıl dışa aktarırım? Yönetilen dışa aktarım S3'e yalnızca DynamoDB JSON / Ion yazar, bu yüzden "CSV'ye" ikinci bir adımdır: dışa aktarma ön ekini bir Athena (ya da Glue) tablosu olarak kaydedin ve bir SELECT'ten CSV yazın. Bir --export-format CSV yoktur.

DynamoDB'yi Excel'e nasıl dışa aktarırım? Önce CSV'ye dışa aktarın (yukarıdaki herhangi bir yöntem), sonra CSV'yi Excel'de açın — uzun sayısal kimlikleri kayan noktalara zorlanmamaları için metin olarak tutun. DynamoDB'den doğrudan bir .xlsx dışa aktarımı yoktur; DynoTable gibi bir GUI geçerli görünümü doğrudan elektronik tabloya hazır bir CSV'ye kaydedebilir.

Dışa aktarılan JSON'umda neden her yerde {"S": ...} ve {"N": ...} var? Bu DynamoDB'nin marshalled telli biçimidir — her değer bir tür tanımlayıcısıyla etiketlenmiştir. Onu CSV yazmadan önce bir SDK, DynamoDB JSON dönüştürücüsü ya da bir GUI ile unmarshall edin. Telli biçim, veri ister API'den ister CLI'den ister S3 dışa aktarımından gelsin aynıdır.

Kendi tablolarınıza göz atın, filtreleyin ve DynoTable ile CSV'ye dışa aktarın ya da önce bir DynamoDB JSON örneğini JSON dönüştürücüde açın.

Güncellendi