Otomatik Yükleyici'de şema çıkarımı ve evrimini yapılandırma

Otomatik Yükleyici'yi, yüklenen verilerin şemasını otomatik olarak algılayarak veri şemasını açıkça bildirmeden tabloları başlatmanıza ve yeni sütunlar kullanıma sunulduğunda tablo şemasını geliştirmenize olanak tanıyacak şekilde yapılandırabilirsiniz. Bu, şema değişikliklerini zaman içinde el ile izleme ve uygulama gereksinimini ortadan kaldırır.

Otomatik Yükleyici ayrıca JSON blob sütununda beklenmeyen (örneğin, farklı veri türleri) verileri "kurtarabilir" ve bu verilere daha sonra yarı yapılandırılmış veri erişim API'lerini kullanarak erişmeyi seçebilirsiniz.

Şema çıkarımı ve evrimi için aşağıdaki biçimler desteklenir:

Dosya biçimi Desteklenen sürümler
JSON Tüm sürümler
CSV Tüm sürümler
XML Databricks Runtime 14.3 ve üzeri
Avro Databricks Runtime 10.2 ve üzeri
Parquet Databricks Runtime 11.1 ve üzeri
ORC Desteklenmeyen
Text Uygulanamaz (sabit şema)
Binaryfile Uygulanamaz (sabit şema)

Şema çıkarımı ve evrimi için söz dizimi

cloudFiles.schemaLocation seçeneği için bir hedef dizin belirtmek şema çıkarımı ve evrimini etkinleştirir. checkpointLocation için belirttiğiniz dizini kullanmayı seçebilirsiniz. Delta Live Tables kullanıyorsanız, Azure Databricks şema konumunu ve diğer denetim noktası bilgilerini otomatik olarak yönetir.

Not

Hedef tabloya yüklenen birden fazla kaynak veri konumunuz varsa, her Otomatik Yükleyici alımı iş yükü ayrı bir akış denetim noktası gerektirir.

Aşağıdaki örnekte için cloudFiles.formatkullanılırparquet. Diğer dosya kaynakları için , avroveya json kullanıncsv. Okuma ve yazma için diğer tüm ayarlar, her biçimin varsayılan davranışları için aynı kalır.

Python

(spark.readStream.format("cloudFiles")
  .option("cloudFiles.format", "parquet")
  # The schema location directory keeps track of your data schema over time
  .option("cloudFiles.schemaLocation", "<path-to-checkpoint>")
  .load("<path-to-source-data>")
  .writeStream
  .option("checkpointLocation", "<path-to-checkpoint>")
  .start("<path_to_target")
)

Scala

spark.readStream.format("cloudFiles")
  .option("cloudFiles.format", "parquet")
  // The schema location directory keeps track of your data schema over time
  .option("cloudFiles.schemaLocation", "<path-to-checkpoint>")
  .load("<path-to-source-data>")
  .writeStream
  .option("checkpointLocation", "<path-to-checkpoint>")
  .start("<path_to_target")

Otomatik Yükleyici şema çıkarımı nasıl çalışır?

Verileri ilk okurken şemayı çıkarsamak için Otomatik Yükleyici, ilk 50 GB veya keşfedtiği 1000 dosyayı (hangi sınır önce aşılırsa) örnekler. Otomatik Yükleyici, şema bilgilerini zaman içinde giriş verilerinde yapılan şema değişikliklerini izlemek için yapılandırılan cloudFiles.schemaLocation dizininde _schemas depolar.

Not

Kullanılan örneğin boyutunu değiştirmek için SQL yapılandırmalarını ayarlayabilirsiniz:

spark.databricks.cloudFiles.schemaInference.sampleSize.numBytes

(bayt dizesi, örneğin 10gb)

ve

spark.databricks.cloudFiles.schemaInference.sampleSize.numFiles

(tamsayı)

Varsayılan olarak, Otomatik Yükleyici şema çıkarımı, tür uyuşmazlıkları nedeniyle şema evrimi sorunlarından kaçınmayı arar. Veri türlerini (JSON, CSV ve XML) kodlamamış biçimler için, Otomatik Yükleyici tüm sütunları dize olarak (JSON dosyalarındaki iç içe yerleştirilmiş alanlar dahil) olarak çıkarsar. Yazılan şemaya (Parquet ve Avro) sahip biçimler için, Otomatik Yükleyici dosyaların bir alt kümesini örnekler ve tek tek dosyaların şemalarını birleştirir. Bu davranış aşağıdaki tabloda özetlanmıştır:

Dosya biçimi Varsayılan çıkarsanan veri türü
JSON String
CSV String
XML String
Avro Avro şemasında kodlanmış türler
Parquet Parquet şemasında kodlanmış türler

Apache Spark DataFrameReader şema çıkarımı için farklı davranışlar kullanır ve örnek verilere göre JSON, CSV ve XML kaynaklarındaki sütunlar için veri türlerini seçer. Otomatik Yükleyici ile bu davranışı etkinleştirmek için seçeneğini cloudFiles.inferColumnTypes olarak trueayarlayın.

Not

CSV verileri için şema çıkarılırken, Otomatik Yükleyici dosyaların üst bilgi içerdiğini varsayar. CSV dosyalarınız üst bilgi içermiyorsa seçeneğini .option("header", "false")belirtin. Ayrıca Otomatik Yükleyici, genel bir şema oluşturmak için örnekteki tüm dosyaların şemalarını birleştirir. Otomatik Yükleyici daha sonra her dosyayı üst bilgisine göre okuyabilir ve CSV'yi doğru ayrıştırabilir.

Not

Bir sütunun iki Parquet dosyasında farklı veri türleri olduğunda, Otomatik Yükleyici en geniş türü seçer. Bu seçimi geçersiz kılmak için schemaHints kullanabilirsiniz. Şema ipuçlarını belirttiğinizde, Otomatik Yükleyici sütunu belirtilen türe atamaz, bunun yerine Parquet okuyucusunun sütunu belirtilen tür olarak okumasını söyler. Uyuşmazlık durumunda, sütun kurtarılan veri sütununda kurtarılır.

Otomatik Yükleyici şemasının evrimi nasıl çalışır?

Otomatik Yükleyici, verilerinizi işlerken yeni sütunların eklenmesini algılar. Otomatik Yükleyici yeni bir sütun algıladığında akış ile UnknownFieldExceptiondurdurulur. Akışınız bu hatayı oluşturmadan önce, Otomatik Yükleyici en son mikro veri toplu işleminde şema çıkarımını gerçekleştirir ve şemanın sonuna yeni sütunları birleştirerek şema konumunu en son şemayla güncelleştirir. Mevcut sütunların veri türleri değişmeden kalır.

Databricks, bu tür şema değişikliklerinin ardından otomatik olarak yeniden başlatmak için iş akışlarıyla Otomatik Yükleyici akışlarının yapılandırılmasını önerir.

Otomatik Yükleyici, seçeneğinde cloudFiles.schemaEvolutionModeayarladığınız şema evrimi için aşağıdaki modları destekler:

Mod Yeni sütunu okuma davranışı
addNewColumns (varsayılan) Akış başarısız oluyor. Şemaya yeni sütunlar eklenir. Mevcut sütunlar veri türlerini geliştirmez.
rescue Şema hiçbir zaman geliştirilmez ve şema değişiklikleri nedeniyle akış başarısız olmaz. Tüm yeni sütunlar kurtarılan veri sütununa kaydedilir.
failOnNewColumns Akış başarısız oluyor. Sağlanan şema güncelleştirilmediği veya sorunlu veri dosyası kaldırılmadığı sürece akış yeniden başlatılmaz.
none Şemayı geliştirmez, yeni sütunlar yoksayılır ve seçenek ayarlanmadığı rescuedDataColumn sürece veriler kurtarılmaz. Şema değişiklikleri nedeniyle akış başarısız olmaz.

Bölümler Otomatik Yükleyici ile nasıl çalışır?

Otomatik Yükleyici, veriler Hive stili bölümlemede düzenlenmişse, verilerin temel dizin yapısından bölüm sütunlarını çıkarma girişiminde bulunur. Örneğin, dosya yolu base_path/event=click/date=2021-04-01/f0.json ve'nin event çıkarımını date bölüm sütunları olarak oluşturur. Temel alınan dizin yapısı çakışan Hive bölümleri içeriyorsa veya Hive stili bölümleme içermiyorsa, bölüm sütunları yoksayılır.

İkili dosya (binaryFile) ve text dosya biçimleri sabit veri şemalarına sahiptir, ancak bölüm sütunu çıkarımı desteklenir. Databricks bu dosya biçimleri için ayar cloudFiles.schemaLocation önerir. Bu, olası hataları veya bilgi kaybını önler ve Otomatik Yükleyici her başladığında bölüm sütunlarının çıkarılmasını önler.

Bölüm sütunları şema evrimi için dikkate alınmaz. gibi base_path/event=click/date=2021-04-01/f0.jsonbir ilk dizin yapınız varsa ve yeni dosyaları olarak base_path/event=click/date=2021-04-01/hour=01/f1.jsonalmaya başladıysanız, Otomatik Yükleyici saat sütununu yoksayar. Yeni bölüm sütunlarına ilişkin bilgileri yakalamak için olarak event,date,hourayarlayıncloudFiles.partitionColumns.

Not

seçeneği cloudFiles.partitionColumns , sütun adlarının virgülle ayrılmış bir listesini alır. Yalnızca dizin yapınızda çift olarak key=value bulunan sütunlar ayrıştırılır.

Kurtarılan veri sütunu nedir?

Otomatik Yükleyici şemayı çıkardığında, kurtarılan bir veri sütunu otomatik olarak şemanıza olarak _rescued_dataeklenir. sütununu yeniden adlandırabilir veya seçeneğini rescuedDataColumnayarlayarak şema sağladığınız durumlarda ekleyebilirsiniz.

Kurtarılan veri sütunu, şemayla eşleşmeyen sütunların bırakılması yerine kurtarılmasını sağlar. Kurtarılan veri sütunu, aşağıdaki nedenlerle ayrıştırılmamış tüm verileri içerir:

  • Şemada sütun eksik.
  • Tür uyuşmazlıkları.
  • Büyük/küçük harf uyuşmazlıkları.

Kurtarılan veri sütunu, kurtarılan sütunları ve kaydın kaynak dosya yolunu içeren bir JSON içerir.

Not

JSON ve CSV ayrıştırıcıları kayıtları ayrıştırırken üç modu destekler: PERMISSIVE, DROPMALFORMEDve FAILFAST. ile rescuedDataColumnbirlikte kullanıldığında, veri türü uyuşmazlıkları kayıtların modda DROPMALFORMED bırakılmasına veya modda hata FAILFAST oluşturmasına neden olmaz. Eksik veya hatalı biçimlendirilmiş JSON veya CSV gibi yalnızca bozuk kayıtlar bırakılır veya hatalar oluşur. JSON veya CSV ayrıştırırken kullanıyorsanız badRecordsPath , kullanırken veri türü uyuşmazlıkları hatalı kayıt rescuedDataColumnolarak kabul edilmez. yalnızca eksik ve yanlış biçimlendirilmiş JSON veya CSV kayıtları içinde badRecordsPathdepolanır.

Büyük/küçük harfe duyarlı davranışı değiştirme

Büyük/küçük harf duyarlılığı etkinleştirilmediği sürece, , Abcve ABC sütunları abcşema çıkarımı amacıyla aynı sütun olarak kabul edilir. Seçilen durum rastgeledir ve örneklenen verilere bağlıdır. Hangi durumun kullanılması gerektiğini zorlamak için şema ipuçlarını kullanabilirsiniz. Bir seçim yapıldıktan ve şema çıkarıldıktan sonra, Otomatik Yükleyici şemayla tutarlı olarak seçilmemiş büyük/küçük harf çeşitlemelerini dikkate almaz.

Kurtarılan veri sütunu etkinleştirildiğinde, şemanın dışında bir durumda adlandırılan alanlar sütuna _rescued_data yüklenir. Seçeneğini readerCaseSensitive false olarak ayarlayarak bu davranışı değiştirin; bu durumda Otomatik Yükleyici verileri büyük/küçük harfe duyarlı olmayan bir şekilde okur.

Şema ipuçlarını kullanarak şema çıkarımı geçersiz kılma

Bildiğiniz ve çıkarım yapılan bir şemada beklediğiniz şema bilgilerini zorunlu kılmak için şema ipuçlarını kullanabilirsiniz. Bir sütunun belirli bir veri türünde olduğunu biliyorsanız veya daha genel bir veri türü (örneğin, yerineinteger) seçmek istiyorsanız, double SQL şema belirtimi söz dizimini kullanarak dize olarak sütun veri türleri için rastgele sayıda ipucu sağlayabilirsiniz; örneğin:

.option("cloudFiles.schemaHints", "tags map<string,string>, version int")

Desteklenen veri türlerinin listesi için veri türleriyle ilgili belgelere bakın.

Akışın başında bir sütun yoksa, bu sütunu çıkarsanan şemaya eklemek için şema ipuçlarını da kullanabilirsiniz.

Burada, şema ipuçlarıyla davranışı görmek için çıkarım yapılan bir şema örneği verilmiştir.

Çıkarsanan şema:

|-- date: string
|-- quantity: int
|-- user_info: struct
|    |-- id: string
|    |-- name: string
|    |-- dob: string
|-- purchase_options: struct
|    |-- delivery_address: string

Aşağıdaki şema ipuçlarını belirterek:

.option("cloudFiles.schemaHints", "date DATE, user_info.dob DATE, purchase_options MAP<STRING,STRING>, time TIMESTAMP")

şunu elde edersiniz:

|-- date: string -> date
|-- quantity: int
|-- user_info: struct
|    |-- id: string
|    |-- name: string
|    |-- dob: string -> date
|-- purchase_options: struct -> map<string,string>
|-- time: timestamp

Not

Dizi ve Eşleme şema ipuçları desteği Databricks Runtime 9.1 LTS ve üzerinde kullanılabilir.

Burada, şema ipuçlarıyla davranışı görmek için karmaşık veri türlerine sahip çıkarımlı bir şema örneği verilmiştir.

Çıkarsanan şema:

|-- products: array<string>
|-- locations: array<string>
|-- users: array<struct>
|    |-- users.element: struct
|    |    |-- id: string
|    |    |-- name: string
|    |    |-- dob: string
|-- ids: map<string,string>
|-- names: map<string,string>
|-- prices: map<string,string>
|-- discounts: map<struct,string>
|    |-- discounts.key: struct
|    |    |-- id: string
|    |-- discounts.value: string
|-- descriptions: map<string,struct>
|    |-- descriptions.key: string
|    |-- descriptions.value: struct
|    |    |-- content: int

Aşağıdaki şema ipuçlarını belirterek:

.option("cloudFiles.schemaHints", "products ARRAY<INT>, locations.element STRING, users.element.id INT, ids MAP<STRING,INT>, names.key INT, prices.value INT, discounts.key.id INT, descriptions.value.content STRING")

şunu elde edersiniz:

|-- products: array<string> -> array<int>
|-- locations: array<int> -> array<string>
|-- users: array<struct>
|    |-- users.element: struct
|    |    |-- id: string -> int
|    |    |-- name: string
|    |    |-- dob: string
|-- ids: map<string,string> -> map<string,int>
|-- names: map<string,string> -> map<int,string>
|-- prices: map<string,string> -> map<string,int>
|-- discounts: map<struct,string>
|    |-- discounts.key: struct
|    |    |-- id: string -> int
|    |-- discounts.value: string
|-- descriptions: map<string,struct>
|    |-- descriptions.key: string
|    |-- descriptions.value: struct
|    |    |-- content: int -> string

Not

Şema ipuçları yalnızca Otomatik Yükleyici'ye bir şema sağlamazsanız kullanılır. Şema ipuçlarını etkin veya devre dışı bırakılmış cloudFiles.inferColumnTypes olarak kullanabilirsiniz.