Aracılığıyla paylaş


Databricks Runtime 7.x geçiş kılavuzu (EoS)

Not

Bu Databricks Runtime sürümü desteği sona erdi. Destek sonu tarihi için bkz . Destek sonu geçmişi. Desteklenen tüm Databricks Runtime sürümleri için bkz . Databricks Runtime sürüm notları sürümleri ve uyumluluğu.

Bu kılavuz, Azure Databricks iş yüklerinizi Apache Spark 2.4 üzerinde oluşturulan Databricks Runtime 6.x'ten Her ikisi de Spark 3.0'da oluşturulan Databricks Runtime 7.3 LTS'ye (EoS) geçirmenize yardımcı olacak yönergeler sağlar.

Bu kılavuzda , Azure Databricks iş yüklerini güncelleştirmenizi gerektirebilecek Spark 3.0 davranış değişiklikleri listelenir. Bu değişikliklerden bazıları Python 2 desteğinin tamamen kaldırılması, Scala 2.12'ye yükseltme, JDK 11 için tam destek ve tarihler ve zaman damgaları için Gregoryen'den Proleptik takvime geçiştir.

Bu kılavuz, Databricks Runtime 7.3 LTS (EoS) geçiş kılavuzunun bir eşlikçisidir.

Databricks Runtime sürümleri arasında geçiş yapma hakkında bilgi için bkz . Databricks Runtime geçiş kılavuzu.

Databricks Runtime 7.x'te sunulan yeni özellikler ve iyileştirmeler

Databricks Runtime 7.3 LTS'de bulunan yeni özelliklerin, iyileştirmelerin ve kitaplık yükseltmelerinin listesi için, geçiş yaptığınız sürümün üzerindeki her Databricks Runtime sürümünün sürüm notlarına bakın. Desteklenen Databricks Runtime 7.x sürümleri şunlardır:

Yayın sonrası bakım güncelleştirmeleri Databricks Runtime için bakım güncelleştirmeleri (arşivlenmiş) bölümünde listelenir.

Databricks Runtime 7.3 LTS sistem ortamı

  • İşletim Sistemi: Ubuntu 18.04.5 LTS
  • Java:
    • 7.3 LTS: Zulu 8.48.0.53-CA-linux64 (derleme 1.8.0_265-b11)
  • Scala: 2.12.10
  • Python: 3.7.5
  • R: 3.6.3 (2020-02-29)
  • Delta Lake 0.7.0

Büyük Apache Spark 3.0 davranış değişiklikleri

Spark 2.4'ten Spark 3.0'a aşağıdaki davranış değişiklikleri, Databricks Runtime 6.x'ten Databricks Runtime 7.x'e geçiş yaptığınızda Azure Databricks iş yüklerini güncelleştirmenizi gerektirebilir.

Not

Bu makalede, Databricks Runtime 7.x'e geçiş yaparken göz önünde bulundurmanız gereken önemli Spark davranışı değişikliklerinin listesi sağlanır. Davranış değişikliklerinin tam listesi için Spark 3.0.1 geçiş kılavuzuna bakın.

Temel

  • Spark 3.0'da, kullanım dışı bırakılan biriktirici v1 kaldırılır.
  • Olay günlüğü dosyası UTF-8 kodlaması olarak yazılır ve Spark Geçmiş Sunucusu olay günlüğü dosyalarını UTF-8 kodlaması olarak yeniden yürütecektir. Daha önce Spark, olay günlüğü dosyasını sürücü JVM işleminin varsayılan karakter kümesi olarak yazdığından, uyumsuz kodlama durumunda eski olay günlüğü dosyalarını okumak için Spark 2.x Spark Geçmiş Sunucusu gereklidir.
  • Karıştırma bloklarını getirmek için yeni bir protokol kullanılır. Spark 3.0 uygulamaları çalıştırılırken dış karıştırma hizmetlerinin yükseltilmesi önerilir. Yapılandırmayı spark.shuffle.useOldFetchProtocol trueolarak ayarlayarak eski dış karıştırma hizmetlerini kullanmaya devam edebilirsiniz. Aksi takdirde Spark gibi IllegalArgumentException: Unexpected message type: <number>iletilerde hatalarla karşılaşabilir.

PySpark

  • Spark 3.0'da, Column.getItem çağrılmayacak Column.applyşekilde düzeltildi. Sonuç olarak, için bağımsız değişken getItemolarak kullanılırsa Column dizin oluşturma işleci kullanılmalıdır. Örneğin, map_col.getItem(col('id')) ile map_col[col('id')]değiştirilmelidir.
  • Spark 3.0 sürümünden itibaren, Row Python sürüm 3.6 ve üzeri için adlandırılmış bağımsız değişkenlerle oluşturulurken alan adları artık alfabetik olarak sıralanmamıştır ve alanların sırası girildikçe aynı olacaktır. Spark 2.4'te olduğu gibi sıralanmış alanları varsayılan olarak etkinleştirmek için ortam değişkenini PYSPARK_ROW_FIELD_SORTING_ENABLED true hem yürütücüler hem de sürücü için olarak ayarlayın. Bu ortam değişkeni tüm yürütücülerde ve sürücüde tutarlı olmalıdır. Aksi takdirde, hatalara veya yanlış yanıtlara neden olabilir. 3.6'dan düşük Python sürümleri için alan adları tek seçenek olarak alfabetik olarak sıralanır.
  • Kullanım dışı Python 2 desteği (SPARK-27884).

Yapılandırılmış Akış

  • Spark 3.0'da, metin, json, csv, parquet ve orc gibi dosya tabanlı veri kaynakları aracılığıyla spark.readStream(...)kullanıldığında Yapılandırılmış Akış kaynak şemayı null atanabilir duruma getirir. Daha önce, kaynak şemadaki null atanabilirliğe saygı gösterirdi; ancak NPE ile hata ayıklama sorunlarına neden oldu. Önceki davranışı geri yüklemek için olarak falseayarlayınspark.sql.streaming.fileSource.schema.forceNullable.
  • Spark 3.0, Stream-stream dış birleşiminde durum şemasını değiştiren doğruluk sorununu düzeltir. Diğer ayrıntılar için bkz . SPARK-26154 . Sorgunuzu stream-stream dış birleşimi kullanan Spark 2.x'ten derlenmiş denetim noktasından başlatırsanız Spark 3.0 sorguda başarısız olur. Çıkışları yeniden hesaplamak için denetim noktasını atıp önceki girişleri yeniden yürütebilirsiniz.
  • Spark 3.0'da, kullanım dışı bırakılan sınıf org.apache.spark.sql.streaming.ProcessingTime kaldırıldı. Bunun yerine org.apache.spark.sql.streaming.Trigger.ProcessingTime kullanın. Benzer şekilde, org.apache.spark.sql.execution.streaming.continuous.ContinuousTrigger yerine kaldırılmıştır Trigger.Continuousve org.apache.spark.sql.execution.streaming.OneTimeTrigger yerine gizlenmiştir Trigger.Once. Bkz. SPARK-28199.

SQL, Veri Kümeleri ve DataFrame

  • Spark 3.0'da, farklı bir veri türüne sahip bir tablo sütununa değer eklerken tür zorlaması ANSI SQL standardına göre gerçekleştirilir. ve'ye double int dönüştürme string gibi bazı makul olmayan tür dönüştürmelerine boolean izin verilmez. Değer sütunun veri türü için aralık dışındaysa çalışma zamanı özel durumu oluşturulur. Spark sürüm 2.4 ve önceki sürümlerinde, geçerli oldukları sürece tablo ekleme sırasında tür dönüştürmelerine Castizin verilir. Tamsayı alanına aralık dışı değer eklerken, değerin düşük sıralı bitleri eklenir (Java/Scala sayısal tür ataması ile aynıdır). Örneğin, bayt türündeki bir alana 257 eklenirse sonuç 1 olur. Davranış, varsayılan değeri "ANSI" olan seçeneği spark.sql.storeAssignmentPolicytarafından denetlenir. Seçeneği "Eski" olarak ayarlamak önceki davranışı geri yükler.
  • Spark 3.0'da dize değeri integral türlerine (tinyint, smallint, int ve bigint), tarih saat türleri (tarih, zaman damgası ve aralık) ve boole türüne dönüştürülürken, baştaki ve sondaki boşluklar (<= ACSII 32) bu tür değerlerine dönüştürülmeden önce kırpılır; örneğincast(' 1\t' as int), döndürür cast(' 1\t' as boolean) 1, döndürürtruecast('2019-10-10\t as date), tarih değerini 2019-10-10döndürür. Spark sürüm 2.4 ve önceki sürümlerinde dizeyi integral'lere ve boole'lara atarken, her iki uçtaki boşluklar kırpılmaz, önceki sonuçlar nullolur ve tarih saatlerine kadar yalnızca sondaki boşluklar (= ASCII 32) kaldırılır. Bkz. https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-apache-spark-3-0.html.
  • Spark 3.0'da, kullanım dışı bırakılan yöntemler SQLContext.createExternalTable ve SparkSession.createExternalTable bunların değiştirilmesi yerine kaldırılmıştır. createTable
  • Spark 3.0'da yapılandırma spark.sql.crossJoin.enabled iç yapılandırmaya dönüşür ve varsayılan olarak true olur, bu nedenle Spark varsayılan olarak sql üzerinde örtük çapraz birleşimlerle bir özel durum oluşturmaz.
  • Spark 3.0'da kırpma işlevinin TRIM(trimStr, str) TRIM(str, trimStr) bağımsız değişken sırasını diğer veritabanlarıyla uyumlu olacak şekilde tersine çevirdik.
  • Spark sürüm 2.4 ve önceki sürümlerinde veya gibi FROM <table> FROM <table> UNION ALL FROM <table> SQL sorguları yanlışlıkla desteklenir. Hive stilinde FROM <table> SELECT <expr>SELECT yan tümcesi göz ardı edilemez. Hive veya Presto bu söz dizimlerini desteklemez. Bu nedenle Spark 3.0'dan bu yana bu sorguları geçersiz olarak değerlendireceğiz.
  • Spark 3.0'dan bu yana Veri Kümesi ve DataFrame API'si unionAll artık kullanım dışı değildir. için bir diğer addır union.
  • Spark sürüm 2.4 ve önceki sürümlerinde, JSON veri kaynağının ayrıştırıcısı gibi bazı veri türleri için boş dizeleri null olarak IntegerTypekabul eder. ve DoubleTypeiçin FloatType boş dizelerde başarısız olur ve özel durumlar oluşturur. Spark 3.0'dan bu yana boş dizelere izin vermediğimiz için ve BinaryTypedışında veri türleri için StringType özel durumlar oluştururuz.
  • Spark 3.0'dan from_json bu yana işlevler iki modu destekler: PERMISSIVE ve FAILFAST. Modlar seçeneği aracılığıyla mode ayarlanabilir. Varsayılan mod oldu PERMISSIVE. Önceki sürümlerde, davranışı from_json yanlış biçimlendirilmiş JSON kayıtlarının işlenmesinde ya da PERMISSIVE FAILFAST, özellikle uyumlu değildi. Örneğin, şemaya a INT sahip JSON dizesi {"a" 1} önceki sürümlere null göre dönüştürülür, ancak Spark 3.0 bunu öğesine Row(null)dönüştürür.

DDL Deyimleri

  • Spark 3.0'da belirli CREATE TABLE bir sağlayıcı olmadan sağlayıcısı olarak değerini spark.sql.sources.default kullanır. Spark sürüm 2.4 ve altında Hive'dı. Spark 3.0'ın önceki davranışını geri yüklemek için olarak trueayarlayabilirsinizspark.sql.legacy.createHiveTableByDefault.enabled.
  • Spark 3.0'da, farklı bir veri türüne sahip bir tablo sütununa değer eklerken tür zorlaması ANSI SQL standardına göre gerçekleştirilir. ve'ye double int dönüştürme string gibi bazı makul olmayan tür dönüştürmelerine boolean izin verilmez. Değer, sütunun veri türü için aralık dışındaysa bir çalışma zamanı özel durumu oluşturulur. Spark sürüm 2.4 ve altında, tablo ekleme sırasında tür dönüştürmelerine, geçerli Castoldukları sürece izin verilir. Tamsayı alanına aralık dışı değer eklerken, değerin düşük sıralı bitleri eklenir (Java/Scala sayısal tür ataması ile aynıdır). Örneğin, bayt türündeki bir alana 257 eklenirse sonuç 1 olur. Davranış, varsayılan değeri "ANSI" olan seçeneği spark.sql.storeAssignmentPolicytarafından denetlenir. Seçeneği "Eski" olarak ayarlamak önceki davranışı geri yükler.
  • Spark 3.0'da, SHOW CREATE TABLE verilen tablo bir Hive SerDe tablosu olsa bile her zaman Spark DDL döndürür. Hive DDL oluşturmak için komutunu kullanın SHOW CREATE TABLE AS SERDE .
  • Spark 3.0'da Hive-Serde olmayan tablolarda tür sütununa CHAR izin verilmez ve CREATE/ALTER TABLE tür algılanırsa CHAR komutlar başarısız olur. Lütfen bunun yerine tür kullanın STRING . Spark sürüm 2.4 ve altında tür tür CHAR olarak STRING değerlendirilir ve uzunluk parametresi yoksayılır.

UDF'ler ve Yerleşik İşlevler

  • Spark 3.0'da varsayılan olarak kullanmaya org.apache.spark.sql.functions.udf(AnyRef, DataType) izin verilmez. true Kullanmaya devam etmek için olarak ayarlayınspark.sql.legacy.allowUntypedScalaUDF. Spark sürüm 2.4 ve altında, ilkel tür bağımsız değişkeniyle Scala kapanışı alırsa org.apache.spark.sql.functions.udf(AnyRef, DataType) , giriş değerleri null olduğunda döndürülen UDF null döndürür. Ancak Spark 3.0'da giriş değeri null olduğunda UDF, Java türünün varsayılan değerini döndürür. Örneğin, val f = udf((x: Int) => x, IntegerType), f($"x") Spark 2.4 ve altında x sütunu null ise null döndürür ve Spark 3.0'da 0 döndürür. Spark 3.0 varsayılan olarak Scala 2.12 ile oluşturulduğundan bu davranış değişikliği ortaya çıkmıştır.
  • Spark sürüm 2.4 ve altında, gibi CreateMapStringToMapyerleşik işlevler aracılığıyla yinelenen anahtarlarla bir harita oluşturabilirsiniz. Yinelenen anahtarlarla eşlemenin davranışı tanımlanmamıştır, örneğin, eşleme araması önce yinelenen anahtarın görünmesine saygı gösterir, Dataset.collect yalnızca yinelenen anahtarın en son görünmesini sağlar, MapKeys yinelenen anahtarlar döndürür vb. Spark 3.0'da, yinelenen anahtarlar RuntimeException bulunduğunda Spark atar. Eşleme anahtarlarını son wins ilkesiyle yinelenenleri kaldırmaya ayarlayabilirsiniz spark.sql.mapKeyDedupPolicy LAST_WIN . Kullanıcılar yine de yinelenen anahtarlarla eşleme değerlerini veri kaynaklarından okuyabilir ve bunu zorunlu kılmaz (örneğin, Parquet), davranış tanımlanmamıştır.

Veri Kaynakları

  • Spark sürüm 2.4 ve altında, ilgili kullanıcı tarafından sağlanan şemaya atanamıyorsa bölüm sütunu değeri null olarak dönüştürülür. 3.0'da bölüm sütunu değeri, kullanıcı tarafından sağlanan bir şemayla doğrulanır. Doğrulama başarısız olursa bir özel durum oluşturulur. olarak ayarlayarak spark.sql.sources.validatePartitionColumns bu doğrulamayı falsedevre dışı bırakabilirsiniz.
  • Spark sürüm 2.4 ve altında, JSON veri kaynağının ayrıştırıcısı gibi bazı veri türleri için boş dizeleri null olarak IntegerTypekabul eder. , DoubleTypeve DateType TimestampTypeiçin FloatTypeboş dizelerde başarısız olur ve özel durumlar oluşturur. Spark 3.0 boş dizelere izin vermemektedir ve ve BinaryTypedışında veri türleri için StringType bir özel durum oluşturur. Boş bir dizeye izin vermenin önceki davranışı olarak ayarlanarak spark.sql.legacy.json.allowEmptyString.enabled truegeri yüklenebilir.
  • Spark 3.0'da, özyinelemeli dizin dökümü sırasında dosyalar veya alt dizinler kaybolursa (yani, bunlar bir ara listede görünür, ancak eş zamanlı dosya silme veya nesne deposu tutarlılığı sorunları nedeniyle özyinelemeli dizin listesinin sonraki aşamalarında okunamaz veya listelenemez) (varsayılan false) olmadığı sürece spark.sql.files.ignoreMissingFiles true liste bir özel durumla başarısız olur. Önceki sürümlerde bu eksik dosyalar veya alt dizinler yoksayılabilirdi. Bu davranış değişikliğinin sorgu yürütme sırasında değil yalnızca ilk tablo dosyası listeleme (veya sırasında REFRESH TABLE) sırasında geçerli olduğunu spark.sql.files.ignoreMissingFiles unutmayın: net değişiklik, yalnızca sorgu yürütme zamanında değil, tablo dosyası listeleme ve sorgu planlaması sırasında da geçerli olur.
  • Spark sürüm 2.4 ve altında, CSV veri kaynağı hatalı biçimlendirilmiş bir CSV dizesini PERMISSIVE modunda tüm null değerleri içeren bir satıra dönüştürür. Spark 3.0'da, bazı CSV sütun değerleri başarıyla ayrıştırılıp istenen türlere dönüştürüldüyse, döndürülen satır null olmayan alanlar içerebilir.
  • Spark 3.0'da, sütunları kaydederken TIMESTAMP varsayılan olarak parquet mantıksal türü TIMESTAMP_MICROS kullanılır. Spark sürüm 2.4 ve altında sütunlar TIMESTAMP parquet dosyalarında olduğu gibi INT96 kaydedilir. Hive 1.x ve Impala 2.x gibi bazı SQL sistemlerinin yalnızca INT96 zaman damgalarını okuyabildiğini unutmayın. Önceki davranışı geri yüklemek ve birlikte çalışabilirliği korumak için olarak INT96 ayarlayabilirsinizspark.sql.parquet.outputTimestampType.
  • Spark 3.0'da, Kullanıcı tarafından sağlanan şemayla Avro dosyaları yazıldığında, alanlar konumlar yerine katalizör şeması ile Avro şeması arasındaki alan adlarıyla eşleştirilir.

Sorgu Altyapısı

  • Spark 3.0'da veri kümesi sorgusu, kendi kendine birleştirmenin neden olduğu belirsiz sütun başvurusu içeriyorsa başarısız olur. Tipik bir örnek: val df1 = ...; val df2 = df1.filter(...);, then df1.join(df2, df1("a") > df2("a")) Oldukça kafa karıştırıcı olan boş bir sonuç döndürür. Bunun nedeni Spark'ın tabloların kendi kendine birleştirildiğine işaret eden veri kümesi sütun başvurularını çözümleyememesi ve df1("a") Spark'takiyle tam olarak df2("a") aynı olmasıdır. Spark 3.0'ın önceki davranışını geri yüklemek için olarak falseayarlayabilirsinizspark.sql.analyzer.failAmbiguousSelfJoin.
  • Spark 3.0'da, bilimsel olarak yazılmış sayılar (örneğin, 1E2) olarak Doubleayrıştırılır. Spark sürüm 2.4 ve altında bunlar olarak Decimalayrıştırılır. Spark 3.0 öncesi davranışı geri yüklemek için olarak ayarlayabilirsiniz spark.sql.legacy.exponentLiteralAsDecimal.enabled true.
  • Spark 3.0'da yapılandırma spark.sql.crossJoin.enabled bir iç yapılandırmaya dönüşür ve varsayılan olarak doğrudur. Varsayılan olarak Spark, örtük çapraz birleşimlerle SQL'de özel durumlar tetiklemiyor.
  • Spark sürüm 2.4 ve altında float/double -0.0, 0.0'a benzer, ancak -0,0 ve 0,0, toplama gruplama anahtarlarında, pencere bölüm anahtarlarında ve birleştirme anahtarlarında kullanıldığında farklı değerler olarak kabul edilir. Spark 3.0'da bu hata düzeltildi. Örneğin, Seq(-0.0, 0.0).toDF("d").groupBy("d").count() Spark 3.0'da ve [(0.0, 1), (-0.0, 1)] Spark 2.4 ve altında döndürür[(0.0, 2)].
  • Spark 3.0'da değişmez değerler SQL TIMESTAMP yapılandırması spark.sql.session.timeZonekullanılarak dizelere dönüştürülür. Spark sürüm 2.4 ve altında dönüştürme, Java sanal makinesinin varsayılan saat dilimini kullanır.
  • Spark 3.0'da Spark, tarihler String /zaman damgaları ile ikili karşılaştırmalarda 'a Date/Timestamp yayınlar. 'a String atamanın Date/Timestamp önceki davranışı olarak ayarlanarak spark.sql.legacy.typeCoercion.datetimeToString.enabled truegeri yüklenebilir.
  • Spark sürüm 2.4 ve altındaki geçersiz saat dilimi kimlikleri sessizce yoksayılır ve örneğin işlevde GMT saat dilimiyle from_utc_timestamp değiştirilir. Spark 3.0'da bu tür saat dilimi kimlikleri reddedilir ve Spark oluşturur java.time.DateTimeException.
  • Spark 3.0'da Proleptik Gregoryen takvim, tarihleri ve zaman damgalarını ayrıştırma, biçimlendirme ve dönüştürmenin yanı sıra yıl, gün vb. gibi alt bileşenleri ayıklamada kullanılır. Spark 3.0, ISO kronolojisini temel alan java.time paketlerinden Java 8 API sınıflarını kullanır. Spark sürüm 2.4 ve altında bu işlemler karma takvim (Julian + Gregoryen) kullanılarak gerçekleştirilir. Değişiklikler, 15 Ekim 1582 (Gregoryen) öncesi tarihlerin sonuçlarını etkiler ve aşağıdaki Spark 3.0 API'sini etkiler:
    • Zaman damgası/tarih dizelerini ayrıştırma/biçimlendirme. Bu, csv/JSON veri kaynakları ve , date_format, to_unix_timestamp, from_unixtime, , to_dateişlevleri to_timestamp üzerindeunix_timestamp, kullanıcılar tarafından belirtilen desenler ayrıştırma ve biçimlendirme için kullanıldığında etkiler. Spark 3.0'da sql-ref-datetime-pattern.md, içinde kendi desen dizelerimizi tanımlarız ve bunu arka planda uygularız java.time.format.DateTimeFormatter . Yeni uygulama, girişi üzerinde sıkı denetim gerçekleştirir. Örneğin, desen yyyy-MM-dd ayrıştırıcının girişin 2015-07-22 10:00:00 tamamını kullanmamasından kaynaklanıyorsa zaman damgası ayrıştırılamaz. Bir diğer örnek de 31/01/2015 00:00 giriş desen tarafından dd/MM/yyyy hh:mm ayrıştırılamıyor çünkü hh saatlerin 1-12 aralığında ön önünde olmasıdır. Spark sürüm 2.4 ve altında, java.text.SimpleDateFormat zaman damgası/tarih dizesi dönüştürmeleri için kullanılır ve desteklenen desenler simpleDateFormat'da açıklanmıştır. eski davranış olarak ayarlanarak spark.sql.legacy.timeParserPolicy LEGACYgeri yüklenebilir.
    • , , , , date_trunc, from_utc_timestamp, to_utc_timestampve unix_timestamp işlevleri, API'yi yılın hafta sayısını, haftanın gün sayısını hesaplamak ve UTC saat dilimindeki değerlerden/değerlere dönüştürme için TimestampType kullanırjava.time. dayofweekweekdayweekofyear
    • JDBC seçenekleri lowerBound ve upperBound , dizeleri TimestampType/DateType değerlerine dönüştürmeyle aynı şekilde TimestampType/DateType değerlerine dönüştürülür. Dönüştürme, Proleptik Gregoryen takvimi ve SQL yapılandırması spark.sql.session.timeZonetarafından tanımlanan saat dilimini temel alır. Spark sürüm 2.4 ve altındaki dönüştürme, karma takvimi (Julian + Gregoryen) ve varsayılan sistem saat dilimini temel alır.
    • Biçimlendirme TIMESTAMP ve DATE değişmez değerler.
    • Dizelerden türlenmiş TIMESTAMP ve DATE değişmez değerler oluşturma. Spark 3.0'da, yazılan TIMESTAMP/DATE değişmez değerlere dize dönüştürme, değerlere TIMESTAMP/DATE dönüştürme yoluyla gerçekleştirilir. Örneğin, TIMESTAMP '2019-12-23 12:59:30' eşanlamlı olarak eşittir CAST('2019-12-23 12:59:30' AS TIMESTAMP). Giriş dizesi saat dilimi hakkında bilgi içermediğinde, BU durumda SQL yapılandırmasından spark.sql.session.timeZone saat dilimi kullanılır. Spark sürüm 2.4 ve altında dönüştürme, JVM sistem saat dilimini temel alır. Varsayılan saat diliminin farklı kaynakları, türü ve TIMESTAMP DATE değişmez değerlerin davranışını değiştirebilir.

Apache Hive

  • Spark 3.0'da, yerleşik Hive sürümünü 1.2'den 2.3'e yükselttik ve bu da aşağıdaki etkileri getirir:
    • Bağlanmak istediğiniz Hive meta veri deposunun sürümüne göre ve spark.sql.hive.metastore.jars ayarlamanız spark.sql.hive.metastore.version gerekebilir. Örneğin: Hive meta veri deposu sürümünüzün 1.2.1 olup olmadığını ve spark.sql.hive.metastore.jars olarak ayarlayın spark.sql.hive.metastore.version 1.2.1.maven
    • Özel SerDes'inizi Hive 2.3'e geçirmeniz veya profilinizle hive-1.2 kendi Spark'ınızı oluşturmanız gerekir. Diğer ayrıntılar için bkz . HIVE-15167 .
    • Betik dönüştürme için SQL'de işleç kullanılırken TRANSFORM hive 1.2 ile Hive 2.3 arasında ondalık dize gösterimi farklı olabilir ve bu durum hive'ın davranışına bağlıdır. Hive 1.2'de dize gösterimi sondaki sıfırları atlar. Ancak Hive 2.3'te, gerekirse her zaman sondaki sıfırlarla birlikte 18 basamakla doldurulur.
    • Databricks Runtime 7.x'te Hive SerDe tablosunu okurken Spark varsayılan olarak tablo bölümü olmayan bir alt dizin altındaki dosyaların okunmasına izin vermez. Etkinleştirmek için yapılandırmasını spark.databricks.io.hive.scanNonpartitionedDirectory.enabled olarak trueayarlayın. Bu, Spark yerel tablo okuyucularını ve dosya okuyucularını etkilemez.

MLlib

  • OneHotEncoder, 2.3'te kullanım dışıdır, 3.0'da kaldırılır ve OneHotEncoderEstimator artık olarak OneHotEncoderyeniden adlandırılır.
  • org.apache.spark.ml.image.ImageSchema.readImages, 2.3'te kullanım dışıdır, 3.0'da kaldırılır. Bunun yerine spark.read.format('image') kullanın.
  • org.apache.spark.mllib.clustering.KMeans.train 2.1'de kullanım dışı bırakılan param Int runsile, 3.0'da kaldırılır. Bunun yerine çalıştırmalar olmadan train yöntemini kullanın.
  • org.apache.spark.mllib.classification.LogisticRegressionWithSGD, 2.0'da kullanım dışıdır, 3.0'da kaldırılır, veya spark.mllib.classification.LogisticRegressionWithLBFGS kullanınorg.apache.spark.ml.classification.LogisticRegression.
  • org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted, 2.1'de kullanım dışıdır, 3.0'da kaldırılır; alt sınıfların kullanması amaçlanmamıştır.
  • org.apache.spark.mllib.regression.RidgeRegressionWithSGD, 2.0'da kullanım dışıdır, 3.0'da kaldırılır. ile kullanın org.apache.spark.ml.regression.LinearRegression elasticNetParam = 0.0. Varsayılan regParam değerin için RidgeRegressionWithSGD0,01, için ise 0,0 LinearRegressionolduğunu unutmayın.
  • org.apache.spark.mllib.regression.LassoWithSGD, 2.0'da kullanım dışıdır, 3.0'da kaldırılır. ile kullanın org.apache.spark.ml.regression.LinearRegression elasticNetParam = 1.0. Varsayılan regParam değerin için LassoWithSGD0,01, için ise 0,0 LinearRegressionolduğunu unutmayın.
  • org.apache.spark.mllib.regression.LinearRegressionWithSGD, 2.0'da kullanım dışıdır, 3.0'da kaldırılır. Bunun yerine veya LBFGS kullanınorg.apache.spark.ml.regression.LinearRegression.
  • org.apache.spark.mllib.clustering.KMeans.getRuns ve setRuns2.1'de kullanım dışı bırakılan ve 3.0'da kaldırılır ve Spark 2.0.0'dan bu yana hiçbir etkisi yoktur.
  • org.apache.spark.ml.LinearSVCModel.setWeightCol, 2.4'te kullanım dışıdır, 3.0'da kaldırılır ve kullanıcılara yönelik değildir.
  • 3.0'da, org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel eğitim parametrelerini kullanıma sunacak şekilde genişletir MultilayerPerceptronParams . Sonuç olarak, layers içinde MultilayerPerceptronClassificationModel olarak değiştirildi Array[Int] IntArrayParam. Katmanların MultilayerPerceptronClassificationModel.layers boyutunu almak için yerine kullanmanız MultilayerPerceptronClassificationModel.getLayers gerekir.
  • org.apache.spark.ml.classification.GBTClassifier.numTrees, 2.4.5'te kullanım dışıdır, 3.0'da kaldırılır. Bunun yerine getNumTrees kullanın.
  • org.apache.spark.ml.clustering.KMeansModel.computeCost, 2.4'te kullanım dışıdır, 3.0'da kaldırılır, bunun yerine kullanın ClusteringEvaluator .
  • 2.0'da org.apache.spark.mllib.evaluation.MulticlassMetricskullanım dışı bırakılan içindeki üye değişkeni duyarlılığı 3.0'da kaldırılır. Bunun yerine doğruluğu kullanın.
  • içindeki 2.0'da kullanım dışı bırakılan üye değişkeni geri çağırma org.apache.spark.mllib.evaluation.MulticlassMetrics, 3.0'da kaldırılır. Bunun yerine accuracy kullanın.
  • içindeki 2.0'da kullanım dışı bırakılan üye değişkeni fMeasure org.apache.spark.mllib.evaluation.MulticlassMetrics3.0'da kaldırılır. Bunun yerine accuracy kullanın.
  • org.apache.spark.ml.util.GeneralMLWriter.context, 2.0'da kullanım dışıdır, 3.0'da kaldırılır. Bunun yerine session kullanın.
  • org.apache.spark.ml.util.MLWriter.context, 2.0'da kullanım dışıdır, 3.0'da kaldırılır. Bunun yerine session kullanın.
  • org.apache.spark.ml.util.MLReader.context, 2.0'da kullanım dışıdır, 3.0'da kaldırılır. Bunun yerine session kullanın.
  • abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]] 3.0 olarak değiştirilir abstract class UnaryTransformer[IN: TypeTag, OUT: TypeTag, T <: UnaryTransformer[IN, OUT, T]] .
  • Spark 3.0'da, Pyspark'taki çok sınıflı lojistik regresyon artık alt sınıfını BinaryLogisticRegressionSummarydeğil (doğru şekilde) döndürürLogisticRegressionSummary. tarafından BinaryLogisticRegressionSummary kullanıma sunulan ek yöntemler bu durumda zaten çalışmaz. (SPARK-31681)
  • Spark 3.0'da mixin'ler pyspark.ml.param.shared.Has* artık herhangi bir set*(self, value) ayarlayıcı yöntemi sağlamaz, bunun yerine ilgili self.set(self.*, value) yöntemi kullanır. Ayrıntılar için bkz. SPARK-29093. (SPARK-29093)

Diğer davranış değişiklikleri

  • Scala 2.12'ye yükseltme aşağıdaki değişiklikleri içerir:

    • Paket hücre serileştirmesi farklı şekilde işlenir. Aşağıdaki örnekte davranış değişikliği ve nasıl işleneceğini gösterilmektedir.

      Aşağıdaki paket hücresinde tanımlandığı gibi çalıştırılırsa foo.bar.MyObjectInPackageCell.run() hata tetiklenir java.lang.NoClassDefFoundError: Could not initialize class foo.bar.MyObjectInPackageCell$

      package foo.bar
      
      case class MyIntStruct(int: Int)
      
      import org.apache.spark.sql.SparkSession
      import org.apache.spark.sql.functions._
      import org.apache.spark.sql.Column
      
      object MyObjectInPackageCell extends Serializable {
      
        // Because SparkSession cannot be created in Spark executors,
        // the following line triggers the error
        // Could not initialize class foo.bar.MyObjectInPackageCell$
        val spark = SparkSession.builder.getOrCreate()
      
        def foo: Int => Option[MyIntStruct] = (x: Int) => Some(MyIntStruct(100))
      
        val theUDF = udf(foo)
      
        val df = {
          val myUDFInstance = theUDF(col("id"))
          spark.range(0, 1, 1, 1).withColumn("u", myUDFInstance)
        }
      
        def run(): Unit = {
          df.collect().foreach(println)
        }
      }
      

      Bu hatayı geçici olarak çözmek için serileştirilebilir bir sınıfın içine sarmalayabilirsiniz MyObjectInPackageCell .

    • Kullanan DataStreamWriter.foreachBatch bazı durumlar için kaynak kodu güncelleştirmesi gerekir. Bu değişikliğin nedeni Scala 2.12'nin lambda ifadelerinden SAM türlerine otomatik dönüştürmeye sahip olması ve belirsizliğe neden olmasıdır.

      Örneğin, aşağıdaki Scala kodu derlenemiyor:

      streams
        .writeStream
        .foreachBatch { (df, id) => myFunc(df, id) }
      

      Derleme hatasını düzeltmek için Java API'sini olarak değiştirin foreachBatch { (df, id) => myFunc(df, id) } veya açıkça kullanın: foreachBatch(new VoidFunction2 ...).foreachBatch(myFunc _)

  • Hive kullanıcı tanımlı işlevleri işlemek için kullanılan Apache Hive sürümü ve Hive SerDes 2.3'e yükseltildiğinden iki değişiklik gerekir:

    • Hive arabiriminin SerDe yerini soyut bir sınıf AbstractSerDealır. Herhangi bir özel Hive SerDe uygulaması için uygulamasına AbstractSerDe geçiş gereklidir.
    • ayarı spark.sql.hive.metastore.jars builtin , Hive 2.3 meta veri deposu istemcisinin Databricks Runtime 7.x için meta veri depolarına erişmek için kullanılacağı anlamına gelir. Hive 1.2 tabanlı dış meta veri depolarına erişmeniz gerekiyorsa, Hive 1.2 jar içeren klasöre ayarlayın spark.sql.hive.metastore.jars .

Kullanımdan kaldırmalar ve kaldırmalar

  • Veri atlama dizini Databricks Runtime 4.3'te kullanım dışı bırakıldı ve Databricks Runtime 7.x'te kaldırıldı. Bunun yerine geliştirilmiş veri atlama özellikleri sunan Delta tablolarını kullanmanızı öneririz.
  • Databricks Runtime 7.x'te Apache Spark'ın temel alınan sürümü Scala 2.12'yi kullanır. Scala 2.11'de derlenen kitaplıklar Databricks Runtime 7.x kümelerini beklenmedik şekilde devre dışı bırakabildiğinden, Databricks Runtime 7.x çalıştıran kümeler tüm kümelere yüklenecek şekilde yapılandırılmış kitaplıkları yüklemez. Küme Kitaplıkları sekmesinde , kitaplık işlemedeki değişiklikleri açıklayan bir durum Skipped ve kullanımdan kaldırma iletisi gösterilir. Ancak, Azure Databricks platformu sürüm 3.20 çalışma alanınızda yayımlanmadan önce Databricks Runtime'ın önceki bir sürümünde oluşturulmuş bir kümeniz varsa ve şimdi bu kümeyi Databricks Runtime 7.x kullanacak şekilde düzenlerseniz, tüm kümelere yüklenmek üzere yapılandırılmış tüm kitaplıklar bu kümeye yüklenir. Bu durumda, yüklü kitaplıklardaki uyumsuz JAR'ler kümenin devre dışı bırakılmasına neden olabilir. Geçici çözüm, kümeyi kopyalamak veya yeni bir küme oluşturmaktır.

Bilinen sorunlar

  • 'D' desen harfini kullanarak yılın gününü ayrıştırma, yıl alanı eksikse yanlış sonuç verir. Bu, bir desen dizesi kullanarak tarih saat dizesini tarih saat değerlerine ayrıştıran SQL işlevlerinde to_timestamp gerçekleşebilir. (SPARK-31939)
  • Anahtarların -0.0 ve 0.0 değerleri varsa, alt sorgular içindeki Birleştirme/Pencere/Toplama yanlış sonuçlara yol açabilir. (SPARK-31958)
  • Pencere sorgusu belirsiz bir kendi kendine birleştirme hatasıyla beklenmedik bir şekilde başarısız olabilir. (SPARK-31956)
  • İşleçli dropDuplicates akış sorguları Spark 2.x tarafından yazılan denetim noktasıyla yeniden başlatılamayabilir. (SPARK-31990)