Snowflake'e Veri Nasıl Yüklenir: Stage, COPY INTO ve Snowpipe
Snowflake'e stage, COPY INTO ve Snowpipe ile veri yükleme adımları, hata yönetimi ve toplu yükleme ile sürekli yükleme arasındaki seçim ölçütleri.
Yüklemenin temel akışı: dosya, stage, tablo
Snowflake'te veri yükleme neredeyse her zaman aynı hattı izler. Kaynak dosyalar (CSV, JSON, Parquet, Avro, ORC, XML gibi biçimler) önce bir stage'e konur. Stage, Snowflake'in dosyaları okuyabildiği bir konumdur: ya Snowflake'in kendi içinde tuttuğu bir iç stage ya da Amazon S3, Google Cloud Storage veya Azure Blob gibi bulut depolamayı gösteren bir dış stage. Ardından bir yükleme komutu dosyaları stage'den hedef tabloya okur.
Bu hattın toplu ve sürekli olmak üzere farklı işletim biçimleri vardır. Toplu yüklemede COPY INTO komutunu siz tetiklersiniz: elle, bir görevle ya da bir orkestrasyon aracıyla. Sürekli yüklemede ise Snowpipe, depolamaya yeni dosya düştüğünde yüklemeyi kendiliğinden başlatır. İkisi de aynı COPY INTO mantığını kullanır; fark, komutu kimin ve ne zaman çalıştırdığı ve hesaplamanın nereden geldiğidir.
Karar vermeden önce şunu netleştirin: veri günde birkaç kez büyük dosyalar halinde mi geliyor, yoksa sürekli küçük dosyalar halinde mi? İlki toplu yüklemeye, ikincisi Snowpipe'a doğal olarak uyar.
Adım adım: stage ve dosya biçimi tanımlamak
Önce yükleme ayarlarını yeniden kullanılabilir nesnelere ayırın. Bir dosya biçimi nesnesi, ayırıcıyı, başlık satırı davranışını ve boş değer gösterimini tek yerde tutar. Bir stage nesnesi ise dosyaların nerede durduğunu söyler.
- Dosya biçimi: CSV için ayırıcı, tırnak karakteri ve başlık satırının atlanıp atlanmayacağı tanımlanır; JSON ve Parquet için tür seçmek çoğu zaman yeterlidir.
- Stage: dış stage için depolama konumu ve erişim yetkisi (tercihen bir storage integration) tanımlanır; iç stage için ek bağlantı gerekmez.
- Dosyaları görmek: stage içeriğini listeleyerek beklediğiniz dosyaların gerçekten orada olduğunu doğrulayın.
İç stage'e yerel bilgisayardan dosya göndermek için SnowSQL gibi istemcilerde PUT komutu kullanılır. Dış stage'de ise dosyaları kendi bulut depolamanıza koymanız yeterlidir; Snowflake onları orada okur. Yetki sorunlarının büyük kısmı bu aşamada çıkar, bu yüzden küçük bir test dosyasıyla başlamak zaman kazandırır.
COPY INTO ile toplu yükleme
En yalın hâliyle komut şöyle görünür:
COPY INTO satislar FROM @ham_veri/satis/ FILE_FORMAT = (FORMAT_NAME = 'csv_bicimi') ON_ERROR = 'SKIP_FILE';
Burada satislar hedef tablo, @ham_veri/satis/ ise stage ve alt yoldur. Belirli dosyaları seçmek için FILES ya da PATTERN kullanılır; PATTERN bir düzenli ifade alır ve tarih bazlı klasörlerle çalışırken işe yarar.
Şu seçenekler günlük işte en çok işinize yarar. ON_ERROR hatalı satır ya da dosya karşısında ne olacağını belirler: CONTINUE hatasız satırları yükler, SKIP_FILE hatalı dosyayı atlar, ABORT_STATEMENT tüm komutu durdurur. Toplu COPY için varsayılan ABORT_STATEMENT'tır. VALIDATION_MODE ise dosyaları yüklemeden kontrol eder ve hataları listeler; yeni bir kaynak bağlarken önce bununla denemek veri tablonuzu kirletmeden sorunları gösterir. MATCH_BY_COLUMN_NAME, kaynak alanlarını tablo sütunlarına adla eşler; Parquet ve JSON gibi biçimlerde sütun sırasına bağımlılığı ortadan kaldırır.
Snowflake, bir tablonun hangi dosyaları zaten yüklediğini kendi meta verisinde tutar. Aynı dosyayı yeniden çalıştırdığınızda tekrar yüklemez. FORCE seçeneği bu korumayı kapatır ve yinelenen satırlara yol açabilir; bilinçli bir yeniden yükleme gerekmedikçe kullanmayın. PURGE ise başarıyla yüklenen dosyaları stage'den siler, ancak silme başarısız olursa hata vermez; stage'i yine de kontrol edin.
Snowpipe ile sürekli yükleme
Snowpipe, stage'e yeni dosya geldiğinde yüklemeyi otomatik yapan bir pipe nesnesidir. Pipe, içinde tek bir COPY INTO ifadesi taşıyan bir şema nesnesidir:
CREATE PIPE satis_pipe AUTO_INGEST = TRUE AS COPY INTO satislar FROM @ham_veri/satis/ FILE_FORMAT = (TYPE = 'JSON');
AUTO_INGEST = TRUE olduğunda, bulut depolama yeni dosyayı bildirir ve Snowpipe dosyayı kuyruğa alıp yükler. Bildirim mekanizması buluta göre değişir: Amazon S3'te olay bildirimi, Google Cloud Storage'ta Pub/Sub, Azure'da Event Grid kullanılır. AUTO_INGEST kapalıyken uygulamanız Snowpipe REST API'sini çağırıp yüklenecek dosya adlarını bildirir.
İki ayrıntı sürprizlerin çoğunu önler. Birincisi, pipe tanımı sonradan düzenlenmez; değişiklik için pipe yeniden oluşturulur. İkincisi, yeni bir pipe yalnızca bildirimler kurulduktan sonra gelen dosyaları yükler; depoda zaten bekleyen dosyalar için ayrıca elle yenileme gerekir. Snowpipe hesaplamayı sunucusuz olarak Snowflake'ten alır; bir sanal ambarı siz boyutlandırmazsınız.
Toplu COPY mi Snowpipe mı: seçim ölçütleri
Tetikleyici: COPY INTO'yu siz ya da bir zamanlayıcı çalıştırır. Snowpipe'ı depolama olayı ya da REST çağrısı çalıştırır.
Hesaplama: COPY INTO sizin boyutlandırdığınız sanal ambarı kullanır. Snowpipe sunucusuz çalışır ve kullanım başına faturalanır.
Hata davranışı: Toplu COPY'de varsayılan komutu durdurmaktır. Snowpipe'ta varsayılan hatalı dosyayı atlamaktır ve ABORT_STATEMENT desteklenmez.
Kontrol: FORCE, VALIDATION_MODE ve PURGE seçenekleri toplu COPY'de vardır, Snowpipe'ta kullanılamaz. Bu yüzden doğrulama ve temizlik adımlarına ihtiyaç duyan bir akış çoğu zaman toplu yüklemede daha rahattır.
Kural olarak: gece çalışan, büyük ve öngörülebilir dosya setleri için COPY INTO; sık gelen, küçük ve gecikmeye duyarlı dosyalar için Snowpipe. Çok küçük dosyaları sürekli yüklemek hem yönetimi hem maliyeti zorlaştırabilir; kaynak tarafta dosyaları makul büyüklükte birleştirmek yaygın bir iyileştirmedir.
Sık yapılan hatalar ve kontrol listesi
Yükleme hatalarının çoğu veri tipinden çok yapılandırmadan doğar. Şu noktaları yükleme canlıya çıkmadan kontrol edin:
- Başlık satırı atlanmamış CSV: ilk satır veri sanılıp sayısal sütunda hataya yol açar.
- Yanlış ayırıcı ya da kodlama: tek sütun halinde yüklenen veri çoğunlukla ayırıcı hatasının belirtisidir.
- Sütun sırası kayması: kaynak sistem sütun eklediğinde sıraya dayalı eşleme sessizce yanlış veri yükler; MATCH_BY_COLUMN_NAME bunu azaltır.
- FORCE ile yinelenen satır: aynı dosya yeniden yüklenir, toplamlar şişer.
- Pipe'ın durumunu izlememek: Snowpipe sessiz çalıştığı için gecikme ve hatalı dosyalar fark edilmez; yükleme geçmişi ve hata görünümleri düzenli taranmalıdır.
- İzinler: dış stage'de okuma yetkisi eksikse komut dosyayı bulamaz, hata mesajı yetkiden çok boş sonuç olarak görünebilir.
Örneğin yeni bir sipariş kaynağı bağlıyorsanız şu sırayı izleyin: küçük örnek dosyayı stage'e koyun, VALIDATION_MODE ile kontrol edin, ON_ERROR ayarını bilinçli seçip COPY INTO ile yükleyin, tablo satır sayısını kaynakla karşılaştırın, ancak sonra Snowpipe'a geçin.
Öğrenme yolu ve Mindset bağlamı
Başlangıç: Snowflake arayüzünde bir tablo ve iç stage oluşturup küçük bir CSV'yi PUT ve COPY INTO ile yükleyin. Orta düzey: dış stage ve storage integration ile bulut depolamadan okuyun, JSON ve Parquet gibi yarı yapısal biçimleri deneyin. İleri düzey: Snowpipe ile otomatik yükleme kurun, hata izleme ve yeniden yükleme prosedürü yazın.
Mindset'in Snowflake ile Veri Sorgulama eğitimi, mimari temellerden sanal ambar yönetimine, batch ve akış yükleme yöntemlerinden yarı yapılandırılmış veri sorgulamaya uzanır. Veri mühendisliği ya da analitik ekiplerinde Snowflake'e yeni geçen çalışanlar için yükleme hattını hem sorgu hem performans tarafıyla birlikte görmeyi sağlar; kurumsal ekipler kendi kaynak sistemlerini örnek vaka olarak getirebilir.
İlgili Mindset programı
Snowflake ile Veri Sorgulama
Sık sorulan sorular
Stage nedir, iç ve dış stage farkı nedir?
Stage, yüklenecek dosyaların durduğu konumdur. İç stage Snowflake'in yönettiği depolamadadır ve dosyalar PUT komutuyla yerelden gönderilir. Dış stage ise sizin S3, Google Cloud Storage ya da Azure depolamanızı gösterir; dosyalar orada kalır ve Snowflake onları yerinde okur. Büyük ve süreklilik gerektiren akışlarda dış stage yaygındır.
Aynı dosyayı yanlışlıkla iki kez yüklersem ne olur?
Varsayılan davranışta Snowflake yüklenmiş dosyaları meta verisinde tuttuğu için değişmemiş bir dosyayı yeniden yüklemez. Yinelenen veri genellikle FORCE seçeneği kullanıldığında ya da dosya adı değiştirilip aynı içerik yeniden gönderildiğinde oluşur. Bu yüzden dosya adlandırmada tutarlı olmak ve FORCE'u yalnızca bilinçli yeniden yüklemede kullanmak gerekir.
Snowpipe ile COPY INTO arasında sonuç farkı var mı?
Sonuçta ikisi de dosya içeriğini tabloya yazar ve pipe içinde bir COPY INTO ifadesi çalışır. Fark tetikleme, hesaplama ve seçeneklerdedir: Snowpipe sunucusuz ve olay tetiklidir, toplu COPY sizin sanal ambarınızla çalışır ve FORCE, VALIDATION_MODE, PURGE gibi seçenekleri destekler.
Snowpipe neden eski dosyaları yüklemedi?
Yeni oluşturulan bir pipe yalnızca bildirimler kurulduktan sonra depoya gelen dosyaları işler. Zaten depoda bekleyen dosyalar için pipe'ı elle yenilemek ya da o dosyalar için bir kerelik toplu COPY INTO çalıştırmak gerekir.
Hatalı satırlar yüzünden tüm yükleme düşmesin istiyorum, ne yapmalıyım?
COPY INTO'da ON_ERROR seçeneğini CONTINUE ya da SKIP_FILE yapabilirsiniz. CONTINUE hatasız satırları yükler, SKIP_FILE hatalı dosyayı bütünüyle atlar. Hangi veriyi kaybetmeyi göze aldığınıza göre seçin ve atlanan kayıtları sonradan inceleyebilmek için hata çıktısını mutlaka saklayın.