Auto Loader ile otomatik tür genişletme

Önemli

Bu özellik Databricks Runtime 16.4 ve üzeri sürümlerin Genel Önizleme sürümündedir.

Otomatik Yükleyici, bulut depolama alanına ulaştıklarında yeni veri dosyalarını artımlı ve verimli bir şekilde işler. Ayrıca karmaşık şema değişikliklerini otomatik olarak işleyerek işlem hattı bakımını azaltır. Örneğin, Otomatik Yükleyici'yi yüklenen verilerin şemasını otomatik olarak algılayarak veri şemasını açıkça bildirmeden tabloları başlatmanıza olanak sağlayacak şekilde yapılandırabilirsiniz. Ayrıca, yeni sütunlar kullanıma sunulduğunda tablo şemasını geliştirerek şema değişikliklerini zaman içinde el ile izleme ve uygulama gereksinimini ortadan kaldırabilirsiniz. Otomatik Yükleyici kurtarılan bir veri sütununda beklenmeyen verileri (örneğin, farklı veri türleri nedeniyle) kurtararak veri kaybını önlemenize yardımcı olabilir.

Ancak kurtarılan veri sütunu, tüm veri türü değişiklikleriyle el ile ilgilenmenizi gerektirir.

Bu veri türü değişikliklerinden bazılarını otomatik olarak işlemek için Otomatik Yükleyici'de tür genişletmeyi kullanın. Delta Lake artık veri yeniden yazma veya kullanıcı müdahalesi gerektirmeden farklı veri türü genişletme değişikliklerini destekliyor. Bkz. Delta Lake Tür genişletmesi. Şema evrimi için yeni mod olan addNewColumnsWithTypeWidening, uyumlu veri türü değişikliklerinde şemayı otomatik olarak geliştirin.

gibi intlongilkel türleri genişletebilir, float ile doubleve daha fazlasını yapabilirsiniz. Otomatik Yükleyici'de şema evrimi desteğine sahip tüm dosya biçimlerinde tür genişletme kullanılabilir. Buna metin biçimleri (JSON, CSV veya XML gibi) ve ikili biçimler (Avro veya Parquet gibi) dahildir. Var olan şema evrimi modlarında (, , addNewColumnsrescueveya failOnNewColumnsgibinone) şema evrimi davranışında bir değişiklik yoktur.

Desteklenen tür değişiklikleri

Aşağıdaki tür değişiklikleri desteklenir:

Kaynak türü Desteklenen daha geniş türler
byte short, int, long, decimal, , double
short int, long, decimal, double
int long, decimal, double
long decimal
float double
decimal decimal daha yüksek hassasiyet ve ölçekle
date timestampNTZ (yalnızca Parquet dosyaları için)

Herhangi bir sayısal türü decimal olarak genişletirken, Otomatik Yükleyici decimal başlangıç kesinliğiyle eşit veya daha büyük bir kesinlikle genişletir. Ölçeği artırırsanız, toplam hassasiyet buna bağlı olarak artar.

Tamsayı türlerinin başlangıç duyarlığı aşağıdaki gibidir:

Türü Başlangıç hassasiyeti
byte 10
short 10
int 10
long 20

Örneğin, bir sütunun geçerli türü int ise ve bu sütunun türü decimal(5, 2) olan bir dosya okunursa, Otomatik Yükleyici bu sütunun türünü decimal(12, 2) olarak genişletir.

Önkoşullar

Otomatik Yükleyici ile tür genişletmeyi kullanmak için aşağıdaki gereksinimleri karşılamanız gerekir:

  • Databricks Runtime 16.4 veya üzerini kullanın.
  • Yazma havuzu bir Delta Lake tablosuysa, aşağıdaki yöntemlerden birini kullanarak Delta Lake tablosu için tür genişletmeyi etkinleştirin:
    • Mevcut bir tablo kullanılıyorsa:

      ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true')
      
    • Tür genişletme etkinleştirilmiş yeni bir tablo oluşturuyorsanız:

      CREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')
      

Delta Lake tablolarında tür genişletme hakkında daha fazla bilgi için bkz. Tür genişletme.

Şema evrimi ile tür genişletmeyi etkinleştirme

Şema evrimi kullanılırken tür genişletmeyi Otomatik Yükleyici ile yapmak için addNewColumnsWithTypeWidening'i belirtin. Otomatik Yükleyici, verilerinizi işlerken yeni sütunların ve tür değişikliklerinin eklenmesini algılar.

Python

query = (spark.readStream
  .format("cloudFiles")
  .option("cloudFiles.format", "csv")
  .option("cloudFiles.inferColumnTypes", True)
  .option("cloudFiles.schemaLocation", <schemaPath>)
  .option("cloudFiles.schemaEvolutionMode", "addNewColumnsWithTypeWidening")
  .load(<inputPath>)
  .writeStream
  .option("mergeSchema", "true")
  .option("checkpointLocation", <checkpointPath>)
  .trigger(availableNow=True)
  .toTable("table_name")
)

Scala

val query = spark.readStream
  .format("cloudFiles")
  .option("cloudFiles.format", "csv")
  .option("cloudFiles.inferColumnTypes", true)
  .option("cloudFiles.schemaLocation", <schemaPath>)
  .option("cloudFiles.schemaEvolutionMode", "addNewColumnsWithTypeWidening")
  .load(<inputPath>)
  .writeStream
  .option("mergeSchema", "true")
  .option("checkpointLocation", <checkpointPath>)
  .trigger(Trigger.AvailableNow())
  .toTable("table_name")

Auto Loader, yeni bir sütun veya tür genişletmesini destekliyorsa bir tür değişikliğini algıladığında, akış UnknownFieldException ile durur. 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 mevcut sütunları genişleterek veya yeni sütunları şemanın sonuna birleştirerek şema konumunu en son şemayla güncelleştirir.

Veri türü değişikliklerinde şema evrimi davranışı

Aşağıdaki içeriğe sahip bir CSV'yi içeri aktarmak isterseniz, Otomatik Yükleyici şemayı STRUCT<id INT, name STRING, _rescued_data STRING> olarak çıkartır.

id, name
1, John
2, Mary

Hedef tablo aşağıdaki gibi görünür:

kimlik isim _rescued_data
1 John null
2 Meryem null

Şimdi, id sütunundaki değerlerin INT türünden daha geniş olduğu başka bir CSV dosyasını içe aktarın.

id, name, age
2147483648, Bob, 25

Aşağıdaki tabloda, Otomatik Yükleyici'de farklı şema evrim modlarıyla davranış ve çıkış açıklanmaktadır:

Çalışma Modu Desteklenen genişletilebilir veri türü değişikliğiyle davranış
addNewColumns (varsayılan) Veri türü gelişmez ve veri türü değişikliği nedeniyle akış başarısız olmaz. Tür eşleşmeyen değerleri olan sütunlar olarak NULLayarlanır ve eşleşmeyen değerler kurtarılan veri sütununa eklenir. Akış yeni sütunlarda başarısız oluyor.
rescue Şema gelişmez ve herhangi bir şema değişikliği nedeniyle akışlar başarısız olmaz. Tür eşleşmeyen değerleri olan sütunlar olarak NULLayarlanır ve eşleşmeyen değerler kurtarılan veri sütununa eklenir.
failOnNewColumns Veri türü gelişmez ve veri türü değişikliği nedeniyle akış başarısız olmaz. Tür eşleşmeyen değerleri olan sütunlar olarak NULLayarlanır ve eşleşmeyen değerler kurtarılan veri sütununa eklenir. Akış, şemayı geliştirmeden yeni sütunlarda başarısız oluyor.
none Şema geliştirilmez, yeni sütunlar yoksayılır ve rescuedDataColumn seçeneği ayarlanmadığı sürece veriler kurtarılmaz. Şema değişiklikleri nedeniyle akış başarısız olmaz.
addNewColumnsWithTypeWidening Akış başarısız oluyor. Şemaya yeni sütunlar eklenir ve desteklenen veri türü değişiklikleri genişletilir. Desteklenmeyen veri türü değişiklikleri (örneğin, int'dan string'e), kurtarılan veri sütununa eklenir.

Örnek sonuçlar

Aşağıdaki bölümlerde, ikinci CSV dosyası alındıktan sonra her şema evrim modu için çıkarsanan şema ve değerler gösterilmektedir.

addNewColumns

Şema: id: INT, name: STRING, age: INT, _rescued_data: STRING

kimlik isim age _rescued_data
1 John null null
2 Meryem null null
null Bob 25 {"id": 2147483648}

rescue

Şema: id: INT, name: STRING, _rescued_data: STRING

kimlik isim _rescued_data
1 John NUL
2 Meryem null
null Bob {"age": 25, "id": 2147483648}

failOnNewColumns

Şema: id: IN_data: STRING

kimlik isim _rescued_data
1 John null
2 Meryem null
null Bob {"id": 2147483648}

none

Şema: 'id: IN

kimlik isim
1 John
2 Meryem
null Bob

addNewColumnsWithTypeWidening

Şema: id: BIGINT, name: STRING, age: INT, _rescued_data: STRING

kimlik isim age _rescued_data
1 John null null
2 Meryem null null
2147483648 Bob 25 null

Sınırlama

  • prefersDecimal seçeneği, false kullanılırken addNewColumnsWithTypeWidening olarak ayarlanamaz. belirtildiğinde addNewColumnsWithTypeWidening varsayılan değeri prefersDecimal şeklindedir true.
  • Parquet dosyaları için date-timestampNTZ genişletme yalnızca desteklenir.