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
true
olarak ayarlayarak eski dış karıştırma hizmetlerini kullanmaya devam edebilirsiniz. Aksi takdirde Spark gibiIllegalArgumentException: Unexpected message type: <number>
iletilerde hatalarla karşılaşabilir.
PySpark
- Spark 3.0'da,
Column.getItem
çağrılmayacakColumn.apply
şekilde düzeltildi. Sonuç olarak, için bağımsız değişkengetItem
olarak kullanılırsaColumn
dizin oluşturma işleci kullanılmalıdır. Örneğin,map_col.getItem(col('id'))
ilemap_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şkeniniPYSPARK_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 olarakfalse
ayarlayı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 yerineorg.apache.spark.sql.streaming.Trigger.ProcessingTime
kullanın. Benzer şekilde,org.apache.spark.sql.execution.streaming.continuous.ContinuousTrigger
yerine kaldırılmıştırTrigger.Continuous
veorg.apache.spark.sql.execution.streaming.OneTimeTrigger
yerine gizlenmiştirTrigger.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ürmestring
gibi bazı makul olmayan tür dönüştürmelerineboolean
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ürmelerineCast
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ğispark.sql.storeAssignmentPolicy
tarafı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ğin
cast(' 1\t' as int)
, döndürürcast(' 1\t' as boolean)
1
, döndürürtrue
cast('2019-10-10\t as date)
, tarih değerini2019-10-10
dö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çlarnull
olur 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
veSparkSession.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 stilindeFROM <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ırunion
. - 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
IntegerType
kabul eder. veDoubleType
içinFloatType
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 veBinaryType
dışında veri türleri içinStringType
özel durumlar oluştururuz. - Spark 3.0'dan
from_json
bu yana işlevler iki modu destekler:PERMISSIVE
veFAILFAST
. Modlar seçeneği aracılığıylamode
ayarlanabilir. Varsayılan mod olduPERMISSIVE
. Önceki sürümlerde, davranışıfrom_json
yanlış biçimlendirilmiş JSON kayıtlarının işlenmesinde ya daPERMISSIVE
FAILFAST,
özellikle uyumlu değildi. Örneğin, şemayaa INT
sahip JSON dizesi{"a" 1}
önceki sürümlerenull
göre dönüştürülür, ancak Spark 3.0 bunu öğesineRow(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ğerinispark.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 olaraktrue
ayarlayabilirsinizspark.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ürmestring
gibi bazı makul olmayan tür dönüştürmelerineboolean
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çerliCast
oldukları 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ğispark.sql.storeAssignmentPolicy
tarafı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ınSHOW CREATE TABLE AS SERDE
. - Spark 3.0'da Hive-Serde olmayan tablolarda tür sütununa
CHAR
izin verilmez veCREATE/ALTER TABLE
tür algılanırsaCHAR
komutlar başarısız olur. Lütfen bunun yerine tür kullanınSTRING
. Spark sürüm 2.4 ve altında tür türCHAR
olarakSTRING
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ırsaorg.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
CreateMap
StringToMap
yerleş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 anahtarlarRuntimeException
bulunduğunda Spark atar. Eşleme anahtarlarını son wins ilkesiyle yinelenenleri kaldırmaya ayarlayabilirsinizspark.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ıfalse
devre 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
IntegerType
kabul eder. ,DoubleType
veDateType
TimestampType
içinFloatType
boş dizelerde başarısız olur ve özel durumlar oluşturur. Spark 3.0 boş dizelere izin vermemektedir ve veBinaryType
dışında veri türleri içinStringType
bir özel durum oluşturur. Boş bir dizeye izin vermenin önceki davranışı olarak ayarlanarakspark.sql.legacy.json.allowEmptyString.enabled
true
geri 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ındaREFRESH TABLE
) sırasında geçerli olduğunuspark.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ütunlarTIMESTAMP
parquet dosyalarında olduğu gibiINT96
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 olarakINT96
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 vedf1("a")
Spark'takiyle tam olarakdf2("a")
aynı olmasıdır. Spark 3.0'ın önceki davranışını geri yüklemek için olarakfalse
ayarlayabilirsinizspark.sql.analyzer.failAmbiguousSelfJoin
. - Spark 3.0'da, bilimsel olarak yazılmış sayılar (örneğin,
1E2
) olarakDouble
ayrıştırılır. Spark sürüm 2.4 ve altında bunlar olarakDecimal
ayrıştırılır. Spark 3.0 öncesi davranışı geri yüklemek için olarak ayarlayabilirsinizspark.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.timeZone
kullanı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 'aDate/Timestamp
yayınlar. 'aString
atamanınDate/Timestamp
önceki davranışı olarak ayarlanarakspark.sql.legacy.typeCoercion.datetimeToString.enabled
true
geri 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ştururjava.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_date
işlevlerito_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'dasql-ref-datetime-pattern.md
, içinde kendi desen dizelerimizi tanımlarız ve bunu arka planda uygularızjava.time.format.DateTimeFormatter
. Yeni uygulama, girişi üzerinde sıkı denetim gerçekleştirir. Örneğin, desenyyyy-MM-dd
ayrıştırıcının girişin2015-07-22 10:00:00
tamamını kullanmamasından kaynaklanıyorsa zaman damgası ayrıştırılamaz. Bir diğer örnek de31/01/2015 00:00
giriş desen tarafındandd/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 ayarlanarakspark.sql.legacy.timeParserPolicy
LEGACY
geri yüklenebilir. - , , , ,
date_trunc
,from_utc_timestamp
,to_utc_timestamp
veunix_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çinTimestampType
kullanırjava.time
.dayofweek
weekday
weekofyear
- JDBC seçenekleri
lowerBound
veupperBound
, 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.timeZone
tarafı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
veDATE
değişmez değerler. - Dizelerden türlenmiş
TIMESTAMP
veDATE
değişmez değerler oluşturma. Spark 3.0'da, yazılanTIMESTAMP/DATE
değişmez değerlere dize dönüştürme, değerlereTIMESTAMP/DATE
dönüştürme yoluyla gerçekleştirilir. Örneğin,TIMESTAMP '2019-12-23 12:59:30'
eşanlamlı olarak eşittirCAST('2019-12-23 12:59:30' AS TIMESTAMP)
. Giriş dizesi saat dilimi hakkında bilgi içermediğinde, BU durumda SQL yapılandırmasındanspark.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ü veTIMESTAMP
DATE
değişmez değerlerin davranışını değiştirebilir.
- Zaman damgası/tarih dizelerini ayrıştırma/biçimlendirme. Bu, csv/JSON veri kaynakları ve ,
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ızspark.sql.hive.metastore.version
gerekebilir. Örneğin: Hive meta veri deposu sürümünüzün 1.2.1 olup olmadığını vespark.sql.hive.metastore.jars
olarak ayarlayınspark.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
olaraktrue
ayarlayın. Bu, Spark yerel tablo okuyucularını ve dosya okuyucularını etkilemez.
- Bağlanmak istediğiniz Hive meta veri deposunun sürümüne göre ve
MLlib
OneHotEncoder
, 2.3'te kullanım dışıdır, 3.0'da kaldırılır veOneHotEncoderEstimator
artık olarakOneHotEncoder
yeniden 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 yerinespark.read.format('image')
kullanın.org.apache.spark.mllib.clustering.KMeans.train
2.1'de kullanım dışı bırakılan param Intruns
ile, 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, veyaspark.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ınorg.apache.spark.ml.regression.LinearRegression
elasticNetParam = 0.0
. VarsayılanregParam
değerin içinRidgeRegressionWithSGD
0,01, için ise 0,0LinearRegression
olduğ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ınorg.apache.spark.ml.regression.LinearRegression
elasticNetParam = 1.0
. VarsayılanregParam
değerin içinLassoWithSGD
0,01, için ise 0,0LinearRegression
olduğ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 veyaLBFGS
kullanınorg.apache.spark.ml.regression.LinearRegression
.org.apache.spark.mllib.clustering.KMeans.getRuns
vesetRuns
2.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şletirMultilayerPerceptronParams
. Sonuç olarak,layers
içindeMultilayerPerceptronClassificationModel
olarak değiştirildiArray[Int]
IntArrayParam
. KatmanlarınMultilayerPerceptronClassificationModel.layers
boyutunu almak için yerine kullanmanızMultilayerPerceptronClassificationModel.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 yerinegetNumTrees
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ınClusteringEvaluator
.- 2.0'da
org.apache.spark.mllib.evaluation.MulticlassMetrics
kullanı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 yerineaccuracy
kullanın. - içindeki 2.0'da kullanım dışı bırakılan üye değişkeni
fMeasure
org.apache.spark.mllib.evaluation.MulticlassMetrics
3.0'da kaldırılır. Bunun yerineaccuracy
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 yerinesession
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 yerinesession
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 yerinesession
kullanın.abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]]
3.0 olarak değiştirilirabstract 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ı
BinaryLogisticRegressionSummary
değil (doğru şekilde) döndürürLogisticRegressionSummary
. tarafındanBinaryLogisticRegressionSummary
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 birset*(self, value)
ayarlayıcı yöntemi sağlamaz, bunun yerine ilgiliself.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 tetiklenirjava.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ıfAbstractSerDe
alır. Herhangi bir özel HiveSerDe
uygulaması için uygulamasınaAbstractSerDe
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ınspark.sql.hive.metastore.jars
.
- Hive arabiriminin
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)