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 LTS ve üzeri |
Avro |
Databricks Runtime 10.4 LTS ve üzeri |
Parquet |
Databricks Runtime 11.3 LTS 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.format
kullanılırparquet
. Diğer dosya kaynakları için , avro
veya 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 true
ayarlayı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 UnknownFieldException
durdurulur. 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.schemaEvolutionMode
ayarladığınız şema evrimi için aşağıdaki modları destekler:
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.json
bir ilk dizin yapınız varsa ve yeni dosyaları olarak base_path/event=click/date=2021-04-01/hour=01/f1.json
almaya 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,hour
ayarlayı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_data
eklenir. sütununu yeniden adlandırabilir veya seçeneğini rescuedDataColumn
ayarlayarak ş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
, DROPMALFORMED
ve FAILFAST
. ile rescuedDataColumn
birlikte 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 rescuedDataColumn
olarak kabul edilmez. yalnızca eksik ve yanlış biçimlendirilmiş JSON veya CSV kayıtları içinde badRecordsPath
depolanı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, , Abc
ve 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.