Sdílet prostřednictvím


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 na true. V opačném případě může Spark narazit na chyby se zprávami jako IllegalArgumentException: Unexpected message type: <number>.

PySpark

  • Ve Sparku 3.0 je opraveno tak, Column.getItem aby nevolal Column.apply. V důsledku toho by se měl použít operátor indexování, pokud Column je použit jako argument getItempro indexování. Například map_col.getItem(col('id')) by měla být nahrazena znakem map_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ěnnou PYSPARK_ROW_FIELD_SORTING_ENABLED prostředí pro true 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í, nastavte spark.sql.streaming.fileSource.schema.forceNullable hodnotu false.
  • 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žijte org.apache.spark.sql.streaming.Trigger.ProcessingTime. Stejně tak, org.apache.spark.sql.execution.streaming.continuous.ContinuousTrigger byl odstraněn ve prospěch Trigger.Continuous, a org.apache.spark.sql.execution.streaming.OneTimeTrigger byl skrytý ve prospěch Trigger.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 na int a double na boolean 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í 1truecast('2019-10-10\t as date) hodnotu 2019-10-10data . 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 budou null, 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 a SparkSession.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, aby TRIM(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 nebo FROM <table> UNION ALL FROM <table> jsou podporované omylem. Ve stylu FROM <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 pro union.
  • 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 IntegerTypeje například . Pro FloatType a DoubleType, 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ýjimkou StringType a BinaryType.
  • Od Sparku 3.0 from_json podporují funkce dva režimy – PERMISSIVE a FAILFAST. Režimy lze nastavit prostřednictvím mode této možnosti. Výchozí režim se stal PERMISSIVE. V předchozích verzích from_json chování neodpovídá buď PERMISSIVE nebo FAILFAST, zejména při zpracování poškozených záznamů JSON. Například řetězec {"a" 1} JSON se schématem a INT se převede na null předchozí verze, ale Spark 3.0 ho převede na Row(null).

Příkazy DDL

  • Ve Sparku 3.0 CREATE TABLE bez konkrétního spark.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 nastavit spark.sql.legacy.createHiveTableByDefault.enabled na truehodnotu .
  • 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 na int a double na boolean 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žijte SHOW CREATE TABLE AS SERDE místo toho příkaz.
  • Ve Sparku 3.0 není sloupec CHAR typu povolený v tabulkách mimo Hive-Serde a CREATE/ALTER TABLE příkazy selžou, pokud CHAR se zjistí typ. Místo toho použijte STRING typ. Ve Sparku verze 2.4 a níže CHAR se typ považuje za STRING 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é. Nastavte spark.sql.legacy.allowUntypedScalaUDF ji tak, aby true 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, StringToMapatd. 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 nastavit spark.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 na false.
  • 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. V FloatTypepřípadě , DateType DoubleTypea TimestampType, 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ýjimkou StringType a BinaryType. Předchozí chování povolení prázdného řetězce lze obnovit nastavením spark.sql.legacy.json.allowEmptyString.enabled na truehodnotu .
  • 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ěhem REFRESH TABLE), ne během provádění dotazu: čistá změna je spark.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ý typ TIMESTAMP_MICROS parquet. Ve Sparku verze 2.4 a níže TIMESTAMP se sloupce ukládají jako INT96 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 nastavit spark.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, a df1("a") je úplně stejné jako df2("a") ve Sparku. Pokud chcete obnovit chování před Sparkem 3.0, můžete nastavit spark.sql.analyzer.failAmbiguousSelfJoin na falsehodnotu .
  • Ve Sparku 3.0 se čísla napsaná ve vědeckém zápisu (například 1E2) analyzují jako Double. Ve Sparku verze 2.4 a níže se parsují jako Decimal. Pokud chcete obnovit chování před Sparkem 3.0, můžete nastavit spark.sql.legacy.exponentLiteralAsDecimal.enabled na truehodnotu .
  • 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í konfigurace spark.sql.session.timeZoneSQL . 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 do Date/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 lze String obnovit nastavením spark.sql.legacy.typeCoercion.datetimeToString.enabled na true.
  • 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_timestampna funkce , date_format, to_unix_timestamp, from_unixtime, , to_datepokud to_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, ve sql-ref-datetime-pattern.mdkterých se implementuje pod java.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 je yyyy-MM-dd vzor, protože analyzátor nevyužívají celý vstup. Dalším příkladem je, že 31/01/2015 00:00 vstup nelze analyzovat vzorem dd/MM/yyyy hh:mm , protože hh presupponuje hodiny v rozsahu 1–12. Ve Sparku verze 2.4 a níže java.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ím spark.sql.legacy.timeParserPolicy na LEGACY.
    • Funkce weekofyear, , weekday, date_truncfrom_utc_timestampto_utc_timestampdayofweeka unix_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/na TimestampType hodnoty v časovém pásmu UTC.
    • Možnosti lowerBound JDBC a upperBound 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.timeZoneSQL . 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 a DATE literály
    • Vytváření typů TIMESTAMP a DATE 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í na TIMESTAMP/DATE hodnoty. Například TIMESTAMP '2019-12-23 12:59:30' je sémanticky roven CAST('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 konfigurace spark.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 a DATE literálů.

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 a spark.sql.hive.metastore.jars podle verze metastoru Hive, ke kterému se chcete připojit. Například: nastavte spark.sql.hive.metastore.version 1.2.1 hodnotu a spark.sql.hive.metastore.jars hodnotu maven , 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 na truehodnotu . To nemá vliv na čtečky nativních tabulek Sparku a čtečky souborů.

MLlib

  • OneHotEncoder, který je zastaralý ve verzi 2.3, je odebrán ve verzi 3.0 a OneHotEncoderEstimator nyní je přejmenován na OneHotEncoder.
  • org.apache.spark.ml.image.ImageSchema.readImages, která je ve verzi 2.3 zastaralá, se odebere ve verzi 3.0. Místo toho použijte spark.read.format('image').
  • org.apache.spark.mllib.clustering.KMeans.train parametr Int runs, 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žije org.apache.spark.ml.classification.LogisticRegression se nebo spark.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 s org.apache.spark.ml.regression.LinearRegression elasticNetParam = 0.0. Všimněte si, že výchozí regParam hodnota je 0,01 pro RidgeRegressionWithSGD, ale je 0,0 pro LinearRegression.
  • org.apache.spark.mllib.regression.LassoWithSGD, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Použít s org.apache.spark.ml.regression.LinearRegression elasticNetParam = 1.0. Všimněte si, že výchozí regParam hodnota je 0,01 pro LassoWithSGD, ale je 0,0 pro LinearRegression.
  • org.apache.spark.mllib.regression.LinearRegressionWithSGD, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Použijte org.apache.spark.ml.regression.LinearRegression nebo LBFGS místo toho.
  • org.apache.spark.mllib.clustering.KMeans.getRuns a setRuns, 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 o org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel zveřejnění tréninkových parametrů. V důsledku toho layers MultilayerPerceptronClassificationModel došlo ke změně na Array[Int] IntArrayParam. Místo načtení velikosti vrstev byste měli použít MultilayerPerceptronClassificationModel.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žijte getNumTrees.
  • org.apache.spark.ml.clustering.KMeansModel.computeCost, která je ve verzi 2.4 zastaralá, se odebere ve verzi 3.0 a použije se ClusteringEvaluator místo toho.
  • Přesnost členské proměnné , org.apache.spark.mllib.evaluation.MulticlassMetricskterá 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.MulticlassMetricskterá je zastaralá ve verzi 2.0, se odebere ve verzi 3.0. Místo toho použijte accuracy.
  • 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žijte accuracy.
  • org.apache.spark.ml.util.GeneralMLWriter.context, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Místo toho použijte session.
  • org.apache.spark.ml.util.MLWriter.context, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Místo toho použijte session.
  • org.apache.spark.ml.util.MLReader.context, který je ve verzi 2.0 zastaralý, se odebere ve verzi 3.0. Místo toho použijte session.
  • abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]] se změní na abstract 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ě) LogisticRegressionSummaryne podtřídu BinaryLogisticRegressionSummary. Další metody vystavené touto metodou BinaryLogisticRegressionSummary 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) } nebo foreachBatch(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řídou AbstractSerDe. Pro jakoukoli vlastní implementaci Hive SerDe je potřeba provést migraci AbstractSerDe .
    • 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, nastavte spark.sql.hive.metastore.jars složku, která obsahuje soubory JAR Hive 1.2.

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)