Průvodce migrací databricks Runtime 7.x (EoS)
Poznámka:
Podpora této verze Databricks Runtime skončila. Datum ukončení podpory najdete v tématu Historie ukončení podpory. Všechny podporované verze databricks Runtime najdete v poznámkách k verzi Databricks Runtime a kompatibilitu.
Tato příručka obsahuje pokyny, které vám pomůžou migrovat úlohy Azure Databricks z Databricks Runtime 6.x založené na Apache Sparku 2.4 do Databricks Runtime 7.3 LTS (EoS), a to jak založené na Sparku 3.0.
Tato příručka uvádí změny chování Sparku 3.0, které můžou vyžadovat aktualizaci úloh Azure Databricks. Mezi tyto změny patří úplné odebrání podpory Pythonu 2, upgrade na Scala 2.12, úplná podpora sady JDK 11 a přechod z gregoriánského kalendáře na proleptický kalendář pro kalendářní data a časová razítka.
Tento průvodce je doprovodným průvodcem migrací databricks Runtime 7.3 LTS (EoS).
Nové funkce a vylepšení dostupná v Databricks Runtime 7.x
Seznam nových funkcí, vylepšení a upgradů knihoven, které jsou součástí Databricks Runtime 7.3 LTS, najdete v poznámkách k verzi pro každou verzi Databricks Runtime nad verzí, ze které migrujete. Podporované verze Databricks Runtime 7.x zahrnují:
Aktualizace údržby po vydání jsou uvedené v aktualizacích údržby pro Databricks Runtime (archivováno).
Systémové prostředí Databricks Runtime 7.3 LTS
- Operační systém: Ubuntu 18.04.5 LTS
- Java:
- 7.3 LTS: Zulu 8.48.0.53-CA-linux64 (build 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
Hlavní změny chování Apache Sparku 3.0
Následující změny chování ze Sparku 2.4 na Spark 3.0 můžou vyžadovat aktualizaci úloh Azure Databricks při migraci z Databricks Runtime 6.x na Databricks Runtime 7.x.
Poznámka:
Tento článek obsahuje seznam důležitých změn chování Sparku, které byste měli zvážit při migraci na Databricks Runtime 7.x.
Základ
- Ve Sparku 3.0 se odebere zastaralý akumulátor v1.
- Soubor protokolu událostí se zapíše jako kódování UTF-8 a Server historie Sparku přehraje soubory protokolu událostí jako kódování UTF-8. Dříve Spark napsal soubor protokolu událostí jako výchozí znakovou sadu procesu JVM ovladače, takže Server historie Sparku Sparku 2.x je potřeba ke čtení starých souborů protokolu událostí v případě nekompatibilního kódování.
- Použije se nový protokol pro načítání bloků náhodného prohazování. Při spouštění aplikací Spark 3.0 se doporučuje upgradovat externí služby náhodného náhodného prohazu. Staré externí služby prohazování můžete dál používat nastavením konfigurace
spark.shuffle.useOldFetchProtocol
natrue
. V opačném případě může Spark narazit na chyby se zprávami jakoIllegalArgumentException: Unexpected message type: <number>
.
PySpark
- Ve Sparku 3.0 je opraveno tak,
Column.getItem
aby nevolalColumn.apply
. V důsledku toho by se měl použít operátor indexování, pokudColumn
je použit jako argumentgetItem
pro indexování. Napříkladmap_col.getItem(col('id'))
by měla být nahrazena znakemmap_col[col('id')]
. - Od Sparku 3.0
Row
se názvy polí už při vytváření s pojmenovanými argumenty pro Python verze 3.6 a vyšší nebudou řadit abecedně a pořadí polí bude odpovídat zadanému pořadí. Pokud chcete ve výchozím nastavení povolit seřazená pole, například ve Sparku 2.4, nastavte proměnnouPYSPARK_ROW_FIELD_SORTING_ENABLED
prostředí protrue
exekutory i ovladače. Tato proměnná prostředí musí být konzistentní pro všechny exekutory a ovladače. Jinak může dojít k chybám nebo nesprávným odpovědím. U verzí Pythonu nižších než 3.6 se názvy polí seřadí abecedně jako jedinou možnost. - Zastaralá podpora Pythonu 2 (SPARK-27884).
Strukturované streamování
- Ve Sparku 3.0 strukturované streamování vynutí zdrojové schéma do hodnoty null, pokud se používají
spark.readStream(...)
zdroje dat založené na souborech, jako je text, json, csv, parquet a orc. Dříve respektovala hodnotu nullability ve zdrojovém schématu; Způsobila ale potíže ladění s NPE. Chcete-li obnovit předchozí chování, nastavtespark.sql.streaming.fileSource.schema.forceNullable
hodnotufalse
. - Spark 3.0 opravuje problém správnosti u vnějšího spojení streamu Stream, který mění schéma stavu. Další podrobnosti najdete v tématu SPARK-26154 . Pokud spustíte dotaz z kontrolního bodu vytvořeného ze Sparku 2.x, který používá vnější spojení stream-stream, Spark 3.0 dotaz selže. Pokud chcete přepočítat výstupy, zahoďte kontrolní bod a přehrajte předchozí vstupy.
- Ve Sparku 3.0 se odebrala zastaralá třída
org.apache.spark.sql.streaming.ProcessingTime
. Místo toho použijteorg.apache.spark.sql.streaming.Trigger.ProcessingTime
. Stejně tak,org.apache.spark.sql.execution.streaming.continuous.ContinuousTrigger
byl odstraněn ve prospěchTrigger.Continuous
, aorg.apache.spark.sql.execution.streaming.OneTimeTrigger
byl skrytý ve prospěchTrigger.Once
. Viz SPARK-28199.
SQL, datové sady a datový rámec
- Ve Sparku 3.0 se při vkládání hodnoty do sloupce tabulky s jiným datovým typem provádí převod typu podle standardu ANSI SQL. Některé nerozumné převody typu, jako je převod
string
naint
adouble
naboolean
které jsou zakázány. Pokud je hodnota mimo rozsah datového typu sloupce, vyvolá se výjimka za běhu. Ve Sparku verze 2.4 a starších jsou převody typů během vkládání tabulek povoleny, pokud jsou platnéCast
. Při vkládání hodnoty mimo rozsah do celočíselného pole se vloží bity s nízkým pořadím hodnoty (stejné jako přetypování číselných typů Java/Scala). Pokud je například 257 vloženo do pole typu bajt, výsledek je 1. Chování je řízeno možnostíspark.sql.storeAssignmentPolicy
, s výchozí hodnotou jako "ANSI". Nastavení možnosti Starší verze obnoví předchozí chování. - Ve Sparku 3.0 se při přetypování řetězcové hodnoty na celočíselné typy (tinyint, smallint, int a bigint), typy data a času (datum, časové razítko a interval) a logický typ, počáteční a koncové prázdné znaky (<= ACSII 32) oříznou před převodem na tyto hodnoty typu, například
cast(' 1\t' as int)
vrátí ,cast(' 1\t' as boolean)
vrátí1
true
cast('2019-10-10\t as date)
hodnotu2019-10-10
data . Ve Sparku verze 2.4 a starší, zatímco přetypování řetězce na integrály a logické hodnoty, neořízne prázdné znaky z obou konců, výše uvedené výsledky budounull
, zatímco do datetimes, budou odebrány pouze koncové mezery (= ASCII 32). Viz třída https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-apache-spark-3-0.html. - Ve Sparku 3.0 byly zastaralé metody
SQLContext.createExternalTable
aSparkSession.createExternalTable
byly odstraněny ve prospěch jejich nahrazení ,createTable
. - Ve Sparku 3.0 se konfigurace
spark.sql.crossJoin.enabled
stane interní konfigurací a ve výchozím nastavení platí, takže Spark ve výchozím nastavení nevyvolá výjimku v SQL s implicitními křížovými spojeními. - Ve Sparku 3.0 jsme převráceli pořadí argumentů funkce
TRIM(trimStr, str)
oříznutí tak, abyTRIM(str, trimStr)
bylo kompatibilní s jinými databázemi. - Ve Sparku verze 2.4 a starších verzích jsou dotazy SQL, jako
FROM <table>
jsou neboFROM <table> UNION ALL FROM <table>
jsou podporované omylem. Ve styluFROM <table> SELECT <expr>
SELECT
hive není klauzule zanedbatelná. Tuto syntaxi nepodporuje Hive ani Presto. Proto tyto dotazy budeme považovat za neplatné od Sparku 3.0. - Vzhledem k tomu, že Spark 3.0, rozhraní API
unionAll
datové sady a datového rámce už není zastaralé. Je to alias prounion
. - Ve Sparku verze 2.4 a starší parser zdroje dat JSON považuje prázdné řetězce za hodnotu null pro některé datové typy, jako
IntegerType
je například . ProFloatType
aDoubleType
, selže na prázdných řetězcích a vyvolá výjimky. Od Sparku 3.0 zakážeme prázdné řetězce a vyvoláme výjimky pro datové typy s výjimkouStringType
aBinaryType
. - Od Sparku 3.0
from_json
podporují funkce dva režimy –PERMISSIVE
aFAILFAST
. Režimy lze nastavit prostřednictvímmode
této možnosti. Výchozí režim se stalPERMISSIVE
. V předchozích verzíchfrom_json
chování neodpovídá buďPERMISSIVE
neboFAILFAST,
zejména při zpracování poškozených záznamů JSON. Například řetězec{"a" 1}
JSON se schématema INT
se převede nanull
předchozí verze, ale Spark 3.0 ho převede naRow(null)
.
Příkazy DDL
- Ve Sparku 3.0
CREATE TABLE
bez konkrétníhospark.sql.sources.default
poskytovatele používá hodnotu jako svého poskytovatele. Ve Sparku verze 2.4 a níže se jednalo o Hive. Pokud chcete obnovit chování před Sparkem 3.0, můžete nastavitspark.sql.legacy.createHiveTableByDefault.enabled
natrue
hodnotu . - Ve Sparku 3.0 se při vkládání hodnoty do sloupce tabulky s jiným datovým typem provádí převod typu podle standardu ANSI SQL. Některé nerozumné převody typu, jako je převod
string
naint
adouble
naboolean
které jsou zakázány. Výjimka za běhu se vyvolá, pokud je hodnota mimo rozsah pro datový typ sloupce. Ve Sparku verze 2.4 a níže jsou převody typů během vkládání tabulky povoleny, pokud jsou platnéCast
. Při vkládání hodnoty mimo rozsah do celočíselného pole se vloží bity s nízkým pořadím hodnoty (stejné jako přetypování číselných typů Java/Scala). Pokud je například 257 vloženo do pole typu bajt, výsledek je 1. Chování je řízeno možnostíspark.sql.storeAssignmentPolicy
, s výchozí hodnotou jako "ANSI". Nastavení možnosti starší verze obnoví předchozí chování. - Ve Sparku 3.0
SHOW CREATE TABLE
vždy vrátí Spark DDL, i když je daná tabulka tabulka Hive SerDe. Pro generování DDL Hive použijteSHOW CREATE TABLE AS SERDE
místo toho příkaz. - Ve Sparku 3.0 není sloupec
CHAR
typu povolený v tabulkách mimo Hive-Serde aCREATE/ALTER TABLE
příkazy selžou, pokudCHAR
se zjistí typ. Místo toho použijteSTRING
typ. Ve Sparku verze 2.4 a nížeCHAR
se typ považuje zaSTRING
typ a parametr délky se jednoduše ignoruje.
Funkce definované uživatelem a předdefinované funkce
- Ve Sparku 3.0 není použití
org.apache.spark.sql.functions.udf(AnyRef, DataType)
ve výchozím nastavení povolené. Nastavtespark.sql.legacy.allowUntypedScalaUDF
ji tak, abytrue
ji dál používala. Pokud ve Sparku verze 2.4 a níže získá uzavření Scala s argumentem primitivního typu, vrátí vrácená funkce definovaná uživatelem hodnotu null,org.apache.spark.sql.functions.udf(AnyRef, DataType)
pokud vstupní hodnoty mají hodnotu null. V Sparku 3.0 ale funkce definovaná uživatelem vrátí výchozí hodnotu typu Java, pokud je vstupní hodnota null. Například vrátí hodnotu null ve Sparku 2.4 a níže,val f = udf((x: Int) => x, IntegerType), f($"x")
pokud má sloupec x hodnotu null, a vrátí hodnotu 0 ve Sparku 3.0. Tato změna chování se zavádí, protože Spark 3.0 je ve výchozím nastavení sestaven se scalou 2.12. - Ve Sparku verze 2.4 a níže můžete vytvořit mapu s duplicitními klíči prostřednictvím předdefinovaných funkcí, jako je
CreateMap
,StringToMap
atd. Chování mapování s duplicitními klíči není definováno, například vyhledávání mapy respektuje duplicitní klíč jako první,Dataset.collect
zachová pouze duplicitní klíč jako poslední,MapKeys
vrátí duplicitní klíče atd. Ve Sparku 3.0 se Spark vyvoláRuntimeException
při nalezení duplicitních klíčů. Můžete nastavitspark.sql.mapKeyDedupPolicy
odstraněníLAST_WIN
duplicitních dat pomocí posledních zásad wins. Uživatelé mohou stále číst hodnoty mapování s duplicitními klíči ze zdrojů dat, které je nevynucují (například Parquet), chování není definováno.
Zdroje dat
- Ve Sparku verze 2.4 a níže se hodnota sloupce oddílu převede na hodnotu null, pokud se nedá přetypovat na odpovídající schéma poskytnuté uživatelem. Ve verzi 3.0 se hodnota sloupce oddílu ověřuje pomocí schématu poskytnutého uživatelem. Pokud se ověření nezdaří, vyvolá se výjimka. Toto ověření můžete zakázat nastavením
spark.sql.sources.validatePartitionColumns
nafalse
. - Ve Sparku verze 2.4 a níže parser zdroje dat JSON považuje prázdné řetězce za hodnotu null pro některé datové typy, například
IntegerType
. VFloatType
případě ,DateType
DoubleType
aTimestampType
, selže na prázdných řetězcích a vyvolá výjimky. Spark 3.0 zakáže prázdné řetězce a vyvolá výjimku pro datové typy s výjimkouStringType
aBinaryType
. Předchozí chování povolení prázdného řetězce lze obnovit nastavenímspark.sql.legacy.json.allowEmptyString.enabled
natrue
hodnotu . - Pokud ve Sparku 3.0 během rekurzivního výpisu adresáře zmizí soubory nebo podadresáře (to znamená, že se zobrazí v přechodném výpisu, ale v pozdějších fázích rekurzivního výpisu adresáře se nedají přečíst ani v pozdějších fázích rekurzivního výpisu kvůli souběžným odstraněním souborů nebo problémům s konzistencí úložiště objektů), výpis selže s výjimkou, pokud
spark.sql.files.ignoreMissingFiles
nenítrue
(výchozí nepravda). V předchozích verzích by se tyto chybějící soubory nebo podadresáře ignorovaly. Všimněte si, že tato změna chování se vztahuje pouze během počátečního výpisu souboru tabulky (nebo běhemREFRESH TABLE
), ne během provádění dotazu: čistá změna jespark.sql.files.ignoreMissingFiles
nyní dodržena během výpisu souboru tabulky a plánování dotazů, a to nejen v době provádění dotazu. - Ve Sparku verze 2.4 a níže převede zdroj dat CSV poškozený řetězec CSV na řádek se všemi nullmi v režimu PERMISSIVE. Vrácený řádek ve Sparku 3.0 může obsahovat nenulová pole, pokud byly některé hodnoty sloupců CSV analyzovány a úspěšně převedeny na požadované typy.
- Ve Sparku 3.0 se při ukládání
TIMESTAMP
sloupců ve výchozím nastavení používá logický typTIMESTAMP_MICROS
parquet. Ve Sparku verze 2.4 a nížeTIMESTAMP
se sloupce ukládají jakoINT96
v souborech parquet. Všimněte si, že některé systémy SQL, jako je Hive 1.x a Impala 2.x, můžou číst pouze časové razítka INT96. Můžete nastavitspark.sql.parquet.outputTimestampType
INT96
obnovení předchozího chování a zachovat interoperabilitu. - Když jsou v Sparku 3.0 zapsány soubory Avro s uživatelským schématem, odpovídají pole názvům polí mezi schématem katalyzátoru a schématem Avro místo pozic.
Dotazovací stroj
- Dotaz datové sady ve Sparku 3.0 selže, pokud obsahuje nejednoznačný odkaz na sloupec, který je způsoben vlastním spojením. Typický příklad:
val df1 = ...; val df2 = df1.filter(...);, then df1.join(df2, df1("a") > df2("a"))
Vrátí prázdný výsledek, který je docela matoucí. Důvodem je to, že Spark nedokáže přeložit odkazy na sloupce datové sady, které odkazují na tabulky, které jsou spojené s vlastním spojením, adf1("a")
je úplně stejné jakodf2("a")
ve Sparku. Pokud chcete obnovit chování před Sparkem 3.0, můžete nastavitspark.sql.analyzer.failAmbiguousSelfJoin
nafalse
hodnotu . - Ve Sparku 3.0 se čísla napsaná ve vědeckém zápisu (například
1E2
) analyzují jakoDouble
. Ve Sparku verze 2.4 a níže se parsují jakoDecimal
. Pokud chcete obnovit chování před Sparkem 3.0, můžete nastavitspark.sql.legacy.exponentLiteralAsDecimal.enabled
natrue
hodnotu . - Ve Sparku 3.0 se konfigurace
spark.sql.crossJoin.enabled
stane interní konfigurací a ve výchozím nastavení platí. Spark ve výchozím nastavení nevyvolá výjimky v SQL s implicitními křížovými spojeními. - Ve Sparku verze 2.4 a níže se hodnota float/double -0.0 sémanticky rovná hodnotě 0.0, ale -0.0 a 0.0 jsou při použití v agregovaných klíčích seskupení, klíčích oddílů okna a spojovacích klíčích považovány za různé hodnoty. Ve Sparku 3.0 je tato chyba opravená. Například
Seq(-0.0, 0.0).toDF("d").groupBy("d").count()
se vrátí[(0.0, 2)]
ve Sparku 3.0 a[(0.0, 1), (-0.0, 1)]
ve Sparku 2.4 a níže. - Ve Sparku 3.0
TIMESTAMP
jsou literály převedeny na řetězce pomocí konfiguracespark.sql.session.timeZone
SQL . Ve Sparku verze 2.4 a novější používá převod výchozí časové pásmo virtuálního počítače Java. - Spark 3.0 přetypuje
String
doDate/Timestamp
binárních porovnání s kalendářními daty a časovými razítky. Předchozí chování přetypováníDate/Timestamp
lzeString
obnovit nastavenímspark.sql.legacy.typeCoercion.datetimeToString.enabled
natrue
. - Ve Sparku verze 2.4 a níže jsou id časových pásem bezobslužně ignorována a nahrazena časovým pásmem GMT, například ve
from_utc_timestamp
funkci. Ve Sparku 3.0 jsou taková ID časového pásma odmítnuta a Spark vyvolájava.time.DateTimeException
. - Ve Sparku 3.0 se proleptický gregoriánský kalendář používá při analýze, formátování a převodu kalendářních dat a časových razítek a také při extrahování dílčích komponent, jako jsou roky, dny atd. Spark 3.0 používá třídy rozhraní API Java 8 z balíčků java.time založených na chronologii ISO. Ve Sparku verze 2.4 a níže se tyto operace provádějí pomocí hybridního kalendáře (Julian + Gregorian). Změny mají vliv na výsledky kalendářních dat před 15. říjnem 1582 (Gregoriánský) a ovlivňují následující rozhraní API Sparku 3.0:
- Analýza/formátování časových razítek a řetězců kalendářních dat Tento vliv na zdroje dat CSV/JSON a
unix_timestamp
na funkce ,date_format
,to_unix_timestamp
,from_unixtime
, ,to_date
pokudto_timestamp
se vzory určené uživateli používají k analýze a formátování. Ve Sparku 3.0 definujeme vlastní vzorové řetězce, vesql-ref-datetime-pattern.md
kterých se implementuje podjava.time.format.DateTimeFormatter
kapotou. Nová implementace provádí striktní kontrolu vstupu. Časové razítko například nelze analyzovat,2015-07-22 10:00:00
pokud jeyyyy-MM-dd
vzor, protože analyzátor nevyužívají celý vstup. Dalším příkladem je, že31/01/2015 00:00
vstup nelze analyzovat vzoremdd/MM/yyyy hh:mm
, protožehh
presupponuje hodiny v rozsahu 1–12. Ve Sparku verze 2.4 a nížejava.text.SimpleDateFormat
se používá pro převody řetězců časového razítka a data a podporované vzory jsou popsány v simpleDateFormat. Původní chování lze obnovit nastavenímspark.sql.legacy.timeParserPolicy
naLEGACY
. - Funkce
weekofyear
, ,weekday
,date_trunc
from_utc_timestamp
to_utc_timestamp
dayofweek
aunix_timestamp
funkce používajíjava.time
rozhraní API pro výpočet počtu týdnů v roce, počtu dní v týdnu a pro převod z/naTimestampType
hodnoty v časovém pásmu UTC. - Možnosti
lowerBound
JDBC aupperBound
jsou převedeny na hodnoty TimestampType/DateType stejným způsobem jako přetypování řetězců na hodnoty TimestampType/DateType. Převod je založen na proleptic gregoriánský kalendář a časové pásmo definované konfiguracíspark.sql.session.timeZone
SQL . Ve Sparku verze 2.4 a níže je převod založený na hybridním kalendáři (Julian + Gregorian) a ve výchozím systémovém časovém pásmu. - Formátování
TIMESTAMP
aDATE
literály - Vytváření typů
TIMESTAMP
aDATE
literálů z řetězců Ve Sparku 3.0 se převod řetězců na typovéTIMESTAMP/DATE
literály provádí přes přetypování naTIMESTAMP/DATE
hodnoty. NapříkladTIMESTAMP '2019-12-23 12:59:30'
je sémanticky rovenCAST('2019-12-23 12:59:30' AS TIMESTAMP)
. Pokud vstupní řetězec neobsahuje informace o časovém pásmu, použije se v takovém případě časové pásmo z konfiguracespark.sql.session.timeZone
SQL. Ve Sparku verze 2.4 a níže je převod založený na časovém pásmu systému JVM. Různé zdroje výchozího časového pásma mohou změnit chování typůTIMESTAMP
aDATE
literálů.
- Analýza/formátování časových razítek a řetězců kalendářních dat Tento vliv na zdroje dat CSV/JSON a
Apache Hive
- Ve Sparku 3.0 jsme upgradovali integrovanou verzi Hive z verze 1.2 na 2.3, která přináší následující dopady:
- Možná budete muset nastavit
spark.sql.hive.metastore.version
aspark.sql.hive.metastore.jars
podle verze metastoru Hive, ke kterému se chcete připojit. Například: nastavtespark.sql.hive.metastore.version
1.2.1
hodnotu aspark.sql.hive.metastore.jars
hodnotumaven
, pokud je vaše verze metastoru Hive 1.2.1. - Musíte migrovat vlastní SerDes do Hive 2.3 nebo vytvořit vlastní Spark s profilem
hive-1.2
. Další podrobnosti najdete v HIVE-15167. - Reprezentace desetinného řetězce se může lišit mezi Hive 1.2 a Hive 2.3 při použití
TRANSFORM
operátoru v SQL pro transformaci skriptu, která závisí na chování Hive. V Hive 1.2 vynechá řetězcové reprezentace koncové nuly. Ale v Hive 2.3 je vždy vycpaný na 18 číslic s koncovými nulami v případě potřeby. - Při čtení tabulky Hive SerDe ve výchozím nastavení Spark při čtení tabulky Databricks Runtime 7.x zakáže čtení souborů v podadresáři, který není oddílem tabulky. Pokud ho chcete povolit, nastavte konfiguraci
spark.databricks.io.hive.scanNonpartitionedDirectory.enabled
natrue
hodnotu . To nemá vliv na čtečky nativních tabulek Sparku a čtečky souborů.
- Možná budete muset nastavit
MLlib
OneHotEncoder
, který je zastaralý ve verzi 2.3, je odebrán ve verzi 3.0 aOneHotEncoderEstimator
nyní je přejmenován naOneHotEncoder
.org.apache.spark.ml.image.ImageSchema.readImages
, která je ve verzi 2.3 zastaralá, se odebere ve verzi 3.0. Místo toho použijtespark.read.format('image')
.org.apache.spark.mllib.clustering.KMeans.train
parametr Intruns
, který je zastaralý ve verzi 2.1, se odebere ve verzi 3.0. Místo toho použijte metodu train bez spuštění.org.apache.spark.mllib.classification.LogisticRegressionWithSGD
, která je ve verzi 2.0 zastaralá, se odebere ve verzi 3.0, použijeorg.apache.spark.ml.classification.LogisticRegression
se nebospark.mllib.classification.LogisticRegressionWithLBFGS
místo toho.org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted
, který je zastaralý ve verzi 2.1, je odebrán ve verzi 3.0, není určen k použití podtříd.org.apache.spark.mllib.regression.RidgeRegressionWithSGD
, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Použít sorg.apache.spark.ml.regression.LinearRegression
elasticNetParam = 0.0
. Všimněte si, že výchozíregParam
hodnota je 0,01 proRidgeRegressionWithSGD
, ale je 0,0 proLinearRegression
.org.apache.spark.mllib.regression.LassoWithSGD
, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Použít sorg.apache.spark.ml.regression.LinearRegression
elasticNetParam = 1.0
. Všimněte si, že výchozíregParam
hodnota je 0,01 proLassoWithSGD
, ale je 0,0 proLinearRegression
.org.apache.spark.mllib.regression.LinearRegressionWithSGD
, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Použijteorg.apache.spark.ml.regression.LinearRegression
neboLBFGS
místo toho.org.apache.spark.mllib.clustering.KMeans.getRuns
asetRuns
, které jsou zastaralé ve verzi 2.1, jsou odebrány ve verzi 3.0 a neměly žádný vliv od Sparku 2.0.0.org.apache.spark.ml.LinearSVCModel.setWeightCol
, která je ve verzi 2.4 zastaralá, se odebere ve verzi 3.0 a není určená pro uživatele.- Ve verzi 3.0 se rozšiřuje
MultilayerPerceptronParams
oorg.apache.spark.ml.classification.MultilayerPerceptronClassificationModel
zveřejnění tréninkových parametrů. V důsledku toholayers
MultilayerPerceptronClassificationModel
došlo ke změně naArray[Int]
IntArrayParam
. Místo načtení velikosti vrstev byste měli použítMultilayerPerceptronClassificationModel.getLayers
MultilayerPerceptronClassificationModel.layers
. org.apache.spark.ml.classification.GBTClassifier.numTrees
, který je zastaralý ve verzi 2.4.5, se odebere ve verzi 3.0. Místo toho použijtegetNumTrees
.org.apache.spark.ml.clustering.KMeansModel.computeCost
, která je ve verzi 2.4 zastaralá, se odebere ve verzi 3.0 a použije seClusteringEvaluator
místo toho.- Přesnost členské proměnné ,
org.apache.spark.mllib.evaluation.MulticlassMetrics
která je zastaralá ve verzi 2.0, se odebere ve verzi 3.0. Místo toho použijte přesnost. - Odvolání členské proměnné ,
org.apache.spark.mllib.evaluation.MulticlassMetrics
která je zastaralá ve verzi 2.0, se odebere ve verzi 3.0. Místo toho použijteaccuracy
. - Proměnná členu
fMeasure
org.apache.spark.mllib.evaluation.MulticlassMetrics
, která je zastaralá ve verzi 2.0, se odebere ve verzi 3.0. Místo toho použijteaccuracy
. org.apache.spark.ml.util.GeneralMLWriter.context
, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Místo toho použijtesession
.org.apache.spark.ml.util.MLWriter.context
, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Místo toho použijtesession
.org.apache.spark.ml.util.MLReader.context
, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Místo toho použijtesession
.abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]]
se změní naabstract class UnaryTransformer[IN: TypeTag, OUT: TypeTag, T <: UnaryTransformer[IN, OUT, T]]
v 3.0.- Ve Sparku 3.0 vrátí vícetřídová logistická regrese v Pysparku (správně)
LogisticRegressionSummary
ne podtříduBinaryLogisticRegressionSummary
. Další metody vystavené touto metodouBinaryLogisticRegressionSummary
by v tomto případě přesto nefungovaly. (SPARK-31681) - Ve Sparku 3.0
pyspark.ml.param.shared.Has*
už mixiny neposkytují žádnéset*(self, value)
metody setter, místo toho použijte příslušnéself.set(self.*, value)
metody. Podrobnosti najdete v tématu SPARK-29093. (SPARK-29093)
Jiné změny chování
Upgrade na Scala 2.12 zahrnuje následující změny:
Serializace buněk balíčku se zpracovává odlišně. Následující příklad ukazuje změnu chování a způsob jeho zpracování.
Spuštění
foo.bar.MyObjectInPackageCell.run()
podle definice v následující buňce balíčku aktivuje chybu.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) } }
Chcete-li tuto chybu obejít, můžete zabalit
MyObjectInPackageCell
do serializovatelné třídy.Použití některých případů
DataStreamWriter.foreachBatch
bude vyžadovat aktualizaci zdrojového kódu. Tato změna je způsobená tím, že Scala 2.12 má automatický převod výrazů lambda na typy SAM a může způsobit nejednoznačnost.Například následující kód Scala se nedá zkompilovat:
streams .writeStream .foreachBatch { (df, id) => myFunc(df, id) }
Chcete-li opravit chybu kompilace, změňte
foreachBatch { (df, id) => myFunc(df, id) }
neboforeachBatch(myFunc _)
použijte rozhraní Java API explicitně:foreachBatch(new VoidFunction2 ...)
.
Vzhledem k tomu, že verze Apache Hivu používaná pro zpracování uživatelem definovaných funkcí Hive a Hive SerDes se upgraduje na verzi 2.3, vyžadují se dvě změny:
- Rozhraní Hive
SerDe
je nahrazeno abstraktní třídouAbstractSerDe
. Pro jakoukoli vlastní implementaci HiveSerDe
je potřeba provést migraciAbstractSerDe
. - Nastavení
spark.sql.hive.metastore.jars
znamenábuiltin
, že klient metastoru Hive 2.3 se použije pro přístup k metastorům pro Databricks Runtime 7.x. Pokud potřebujete získat přístup k externím metastorům založeným na Hive 1.2, nastavtespark.sql.hive.metastore.jars
složku, která obsahuje soubory JAR Hive 1.2.
- Rozhraní Hive
Vyřazení a odebrání
- Index přeskakování dat byl v Databricks Runtime 4.3 zastaralý a odebrán v Databricks Runtime 7.x. Místo toho doporučujeme používat tabulky Delta, které nabízejí vylepšené možnosti přeskakování dat.
- Základní verze Apache Sparku v Databricks Runtime 7.x používá Scala 2.12. Vzhledem k tomu, že knihovny kompilované v jazyce Scala 2.11 můžou clustery Databricks Runtime 7.x zakázat neočekávaným způsobem, clustery s Modulem Databricks Runtime 7.x neinstalují knihovny nakonfigurované tak, aby se nainstalovaly do všech clusterů. Na kartě Knihovny clusteru se zobrazuje stav
Skipped
a zpráva o vyřazení, která vysvětluje změny v zpracování knihovny. Pokud ale máte cluster vytvořený ve starší verzi Databricks Runtime před vydáním platformy Azure Databricks verze 3.20 do vašeho pracovního prostoru a teď tento cluster upravíte tak, aby používal Databricks Runtime 7.x, všechny knihovny, které byly nakonfigurované tak, aby se nainstalovaly na všechny clustery, se do tohoto clusteru nainstalují. V takovém případě můžou všechny nekompatibilní žádosti o přijetí změn v nainstalovaných knihovnách způsobit zakázání clusteru. Alternativním řešením je klonování clusteru nebo vytvoření nového clusteru.
Známé problémy
- Analýza dne v roce pomocí vzorového písmena D vrátí nesprávný výsledek, pokud pole roku chybí. K tomu může dojít ve funkcích SQL, jako
to_timestamp
je analýza řetězce datetime na hodnoty datetime pomocí vzorového řetězce. (SPARK-31939) - Spojení, okno nebo agregace uvnitř poddotazů může vést k nesprávným výsledkům, pokud klíče mají hodnoty -0,0 a 0.0. (SPARK-31958)
- Dotaz okna může selhat s neočekávanou chybou automatického spojení s nejednoznačným spojením. (SPARK-31956)
- Dotazy streamování s operátorem
dropDuplicates
nemusí být možné restartovat s kontrolním bodem napsaným Sparkem 2.x. (SPARK-31990)