共用方式為


Databricks Runtime 7.x 移轉指南 (不支援)

本指南提供指引,可協助您將 Azure Databricks 工作負載從以 Apache Spark 2.4 為基礎的 Databricks Runtime 6.x 移轉至 Databricks Runtime 7.3 LTS(不支援),這兩者都是建置在 Spark 3.0 上。

本指南列出 可能需要更新 Azure Databricks 工作負載的 Spark 3.0 行為變更 。 其中一些變更包括完整移除 Python 2 支援、升級至 Scala 2.12、JDK 11 的完整支援,以及從公曆切換至日期和時間時間戳的 Proleptic 行事曆。

本指南是 Databricks Runtime 7.3 LTS(不支援)移轉指南的隨附

如需在 Databricks 運行時間版本之間移轉的資訊,請參閱 Databricks Runtime 移轉指南

Databricks Runtime 7.x 上可用的新功能和改進功能

如需 Databricks Runtime 7.3 LTS 中包含的新功能、改進和連結庫升級清單,請參閱您在移轉版本上方每個 Databricks Runtime 版本的版本資訊。 支援的 Databricks Runtime 7.x 版本包括:

發行后維護更新會列在 Databricks Runtime 的維護更新中(封存)。

Databricks Runtime 7.3 LTS 系統環境

  • 操作系統:Ubuntu 18.04.5 LTS
  • Java
    • 7.3 LTS: Zulu 8.48.0.53-CA-linux64 (組建 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

主要 Apache Spark 3.0 行為變更

當您從 Databricks Runtime 6.x 移轉至 Databricks Runtime 7.x 時,下列從 Spark 2.4 變更為 Spark 3.0 的行為可能需要更新 Azure Databricks 工作負載。

注意

本文提供移轉至 Databricks Runtime 7.x 時要考慮的重要 Spark 行為變更清單。 如需行為變更的完整清單,請參閱 Spark 3.0.1 移轉指南

核心

  • 在Spark 3.0中,已移除已被取代的累積器 v1。
  • 事件記錄檔會以UTF-8編碼方式寫入,而Spark歷程記錄伺服器會以UTF-8編碼方式重新執行事件記錄檔。 先前 Spark 會將事件記錄檔寫入為驅動程式 JVM 進程的預設字元集,因此需要 Spark 2.x 的 Spark 歷程記錄伺服器,才能讀取舊的事件記錄檔,以防編碼不相容。
  • 使用用於擷取隨機區塊的新通訊協定。 建議您在執行 Spark 3.0 應用程式時升級外部隨機服務。 您仍然可以將組 spark.shuffle.useOldFetchProtocol 態設定為 true,以使用舊的外部隨機服務。 否則,Spark 可能會發生類似 訊息 IllegalArgumentException: Unexpected message type: <number>的錯誤。

PySpark

  • 在Spark 3.0中, Column.getItem 已修正,使其不會呼叫 Column.apply。 因此,如果使用 Column 做為 的 getItem自變數,則應該使用索引運算符。 例如, map_col.getItem(col('id')) 應該以 map_col[col('id')]取代 。
  • 從 Spark 3.0 開始,使用 Python 3.6 版和更新版本的具名自變數建構時, Row 功能變數名稱不會再依字母順序排序,而且字段的順序會與輸入的相符。 若要依預設啟用已排序的欄位,如 Spark 2.4 所示,請將執行程式和驅動程式的環境變數 PYSPARK_ROW_FIELD_SORTING_ENABLED 設定為 true 。 此環境變數在所有執行程式和驅動程式上都必須一致。 否則,它可能會導致失敗或不正確的答案。 對於低於 3.6 的 Python 版本,功能變數名稱會依字母順序排序為唯一的選項。
  • 已被取代的 Python 2 支援 (SPARK-27884)。

結構化串流

  • 在Spark 3.0中,結構化串流會在透過 使用 spark.readStream(...)文字、json、csv、parquet 和orc等檔案型數據源時,強制將來源架構強制為可為Null。 先前,它尊重來源架構中的 Null 性;不過,這會導致使用 NPE 進行偵錯時發生問題。 若要還原先前的行為,請將 設定 spark.sql.streaming.fileSource.schema.forceNullablefalse
  • Spark 3.0 修正 Stream-stream 外部聯結的正確性問題,這會變更狀態的架構。 如需詳細資訊,請參閱 SPARK-26154 。 如果您從使用數據流外部聯結的Spark 2.x 建構的檢查點啟動查詢,Spark 3.0 會讓查詢失敗。 若要重新計算輸出,請捨棄檢查點並重新執行先前的輸入。
  • 在Spark 3.0中,已移除已被取代的類別 org.apache.spark.sql.streaming.ProcessingTime 。 請改用 org.apache.spark.sql.streaming.Trigger.ProcessingTime。 同樣地, org.apache.spark.sql.execution.streaming.continuous.ContinuousTrigger 已被移除贊成 Trigger.Continuous,並 org.apache.spark.sql.execution.streaming.OneTimeTrigger 一直隱藏在贊成 Trigger.Once。 請參閱 SPARK-28199

SQL、數據集和數據框架

  • 在Spark 3.0中,將值插入具有不同數據類型的數據表數據行時,會根據ANSI SQL標準執行類型強制。 不允許某些不合理的類型轉換,例如轉換成 stringintdoubleboolean 。 如果數據行數據類型的值超出範圍,則會擲回運行時間例外狀況。 在Spark 2.4版和更早版本中,只要是有效的 Cast,就允許在數據表插入期間進行類型轉換。 將超出範圍值插入整數位段時,會插入值的低階位(與 Java/Scala 數值類型轉換相同)。 例如,如果將 257 插入位元組類型的欄位,則結果為 1。 行為是由 選項 spark.sql.storeAssignmentPolicy所控制,預設值為 “ANSI”。 將選項設定為 [舊版] 會還原先前的行為。
  • 在Spark 3.0中,將字串值轉換成整數類型(tinyint、smallint、int和 bigint)、datetime 類型(date、timestamp 和 interval)和布爾值類型時,會先修剪前置和尾端空格符(<= ACSII 32),然後再轉換成這些類型值,例如cast(' 1\t' as int)傳回 、傳回 1cast(' 1\t' as boolean)truecast('2019-10-10\t as date)傳回日期值。2019-10-10 在Spark 2.4版和更早版本中,將字串轉換成整數和布爾值時,不會從兩端修剪空格符,上述結果將會 null是 ,而至日期時間,只會移除尾端空格 (= ASCII 32)。 請參閱 https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-apache-spark-3-0.html
  • 在Spark 3.0中,已被取代的方法SQLContext.createExternalTable已被取代,並SparkSession.createExternalTable已移除,以取代它們。 createTable
  • 在Spark 3.0中,組態 spark.sql.crossJoin.enabled 會變成內部組態,且預設為 true,因此根據預設,Spark 不會在 SQL 上引發隱含交叉聯結的例外狀況。
  • 在Spark 3.0中,我們將 trim 函 TRIM(trimStr, str) 式的自變數順序從 反轉為 TRIM(str, trimStr) 與其他資料庫相容。
  • 在Spark 2.4版和更早版本中,意外支援或 FROM <table> UNION ALL FROM <table> 之類的 FROM <table> SQL查詢。 在hive樣式 FROM <table> SELECT <expr>SELECT ,子句不可忽略。 Hive 和 Presto 都不支援此語法。 因此,我們將這些查詢視為無效,因為Spark 3.0。
  • 由於 Spark 3.0,數據集和數據框架 API unionAll 不再被取代。 它是的 union別名。
  • 在Spark 2.4版和更早版本中,JSON 資料源的剖析器會將空字串視為 Null,例如 。IntegerType 針對 FloatTypeDoubleType,它會在空字串上失敗,並擲回例外狀況。 由於 Spark 3.0,我們不允許空字串串,而且會針對和 以外的StringTypeBinaryType數據類型擲回例外狀況。
  • 由於 Spark 3.0,函 from_json 式支援兩種模式 - PERMISSIVEFAILFAST。 模式可以透過 mode 選項來設定。 預設模式會變成 PERMISSIVE。 在舊版中,的行為 from_json 不符合 PERMISSIVEFAILFAST, 特別是在處理格式不正確的 JSON 記錄時。 例如,具有架構a INT的 JSON 字串{"a" 1}會由舊版轉換成 null ,但 Spark 3.0 會將它Row(null)轉換成 。

DDL 陳述式

  • 在Spark 3.0中, CREATE TABLE 沒有特定提供者會使用的值 spark.sql.sources.default 做為其提供者。 在Spark 2.4版和以下版本中,它是Hive。 若要還原 Spark 3.0 之前的行為,您可以將 設定 spark.sql.legacy.createHiveTableByDefault.enabledtrue
  • 在Spark 3.0中,將值插入具有不同數據類型的數據表數據行時,會根據ANSI SQL標準執行類型強制。 不允許某些不合理的類型轉換,例如轉換成 stringintdoubleboolean 。 如果數據行數據類型的值超出範圍,則會擲回運行時間例外狀況。 在Spark 2.4版和以下版本中,只要是有效的 Cast,就允許在數據表插入期間進行類型轉換。 將超出範圍值插入整數位段時,會插入值的低階位(與 Java/Scala 數值類型轉換相同)。 例如,如果將 257 插入位元組類型的欄位,則結果為 1。 行為是由 選項 spark.sql.storeAssignmentPolicy所控制,預設值為 “ANSI”。 將選項設定為 「舊版」會還原先前的行為。
  • 在Spark 3.0中, SHOW CREATE TABLE 一律會傳回Spark DDL,即使指定的數據表是Hive SerDe 資料表也一樣。 若要產生Hive DDL,請改用 SHOW CREATE TABLE AS SERDE 命令。
  • 在Spark 3.0中,非Hive-Serde資料表中不允許類型的數據CHAR行,如果CREATE/ALTER TABLECHAR偵測到類型,命令將會失敗。 請改用 STRING 類型。 在Spark 2.4版和以下版本中, CHAR type 會 STRING 被視為 type,而且只會忽略 length 參數。

UDF 和內建函式

  • 在 Spark 3.0 中,預設不允許使用 org.apache.spark.sql.functions.udf(AnyRef, DataType) 。 設定 spark.sql.legacy.allowUntypedScalaUDFtrue 以繼續使用。 在Spark 2.4版和以下版本中,如果 org.apache.spark.sql.functions.udf(AnyRef, DataType) 取得具有基本類型自變數的 Scala 關閉,則傳回的 UDF 會在輸入值為 null 時傳回 Null。 不過,在Spark 3.0中,如果輸入值為Null,UDF會傳回Java類型的預設值。 例如, val f = udf((x: Int) => x, IntegerType), f($"x") 如果 column x 為 null,則會在 Spark 2.4 中傳回 null,並在 Spark 3.0 中傳回 0。 因為Spark 3.0預設是使用 Scala 2.12 建置,因此引進此行為變更。
  • 在Spark 2.4版和以下版本中,您可以透過、 StringToMap等內建函CreateMap式建立具有重複索引鍵的對應。未定義具有重複索引鍵的對應行為,例如,地圖查閱會先顯示重複的索引鍵,只保留重複的索引鍵最後出現、 Dataset.collectMapKeys傳回重複的索引鍵等等。在Spark 3.0中,找到重複的索引鍵時,Spark 會RuntimeException擲回。 您可以使用最後一個勝利原則,將 設定 spark.sql.mapKeyDedupPolicyLAST_WIN 重複資料刪除對應金鑰。 使用者仍然可以從未強制執行的數據源讀取具有重複索引鍵的對應值(例如 Parquet),行為是未定義的。

資料來源

  • 在Spark 2.4版和以下版本中,如果無法轉換成對應的使用者提供的架構,分割區數據行值會轉換成 null。 在 3.0 中,數據分割資料行值會以使用者提供的架構進行驗證。 如果驗證失敗,則會擲回例外狀況。 您可以將 設定 spark.sql.sources.validatePartitionColumnsfalse來停用這類驗證。
  • 在Spark 2.4版和以下版本中,JSON數據源的剖析器會將空字串視為 Null,例如 。IntegerType 針對FloatTypeDoubleTypeDateTypeTimestampType,它會在空字串上失敗,並擲回例外狀況。 Spark 3.0 不允許空字串,而且會針對和 以外的StringTypeBinaryType數據類型擲回例外狀況。 將 設定spark.sql.legacy.json.allowEmptyString.enabledtrue為 ,即可還原允許空字串的先前行為。
  • 在 Spark 3.0 中,如果檔案或子目錄在遞歸目錄清單期間消失(亦即,它們會出現在中繼清單中,但在遞歸目錄清單的後續階段無法讀取或列出,因為 spark.sql.files.ignoreMissingFilestrue 並行檔案刪除或物件存放區一致性問題),除非是 (預設值 false),否則清單將會失敗並出現例外狀況。 在舊版中,將會忽略這些遺漏的檔案或子目錄。 請注意,這種行為變更僅適用於初始數據表檔案清單(或期間 REFRESH TABLE),而不是在查詢執行期間:net change 是 spark.sql.files.ignoreMissingFiles 現在在數據表檔案清單和查詢規劃期間遵守,而不只是在查詢運行時間。
  • 在Spark 2.4版和以下版本中,CSV數據源會將格式錯誤的 CSV 字串轉換成具有 PERMISSIVE 模式中所有 Null 的數據列。 在Spark 3.0中,如果某些CSV資料行值剖析並成功轉換成所需的類型,傳回的數據列可以包含非 Null 字段。
  • 在Spark 3.0中,預設會使用 parquet 邏輯類型 TIMESTAMP_MICROS ,同時儲存 TIMESTAMP 數據行。 在Spark 2.4版和以下版本中, TIMESTAMP 數據行會儲存為 INT96 parquet 檔案中。 請注意,Hive 1.x 和 Impala 2.x 等某些 SQL 系統只能讀取 INT96 時間戳。 您可以將 設定spark.sql.parquet.outputTimestampTypeINT96為 以還原先前的行為並保留互操作性。
  • 在Spark 3.0中,當Avro檔案是以使用者提供的架構撰寫時,欄位會以催化劑架構與Avro架構之間的功能變數名稱比對,而不是位置。

查詢引擎

  • 在Spark 3.0中,如果數據集查詢包含由自我聯結所造成的模棱兩可數據行參考,則查詢會失敗。 典型的範例: val df1 = ...; val df2 = df1.filter(...);, then df1.join(df2, df1("a") > df2("a")) 傳回一個相當令人困惑的空白結果。 這是因為 Spark 無法解析指向自我聯結之數據表的數據集數據行參考,而且 df1("a")df2("a") Spark 中完全相同。 若要還原 Spark 3.0 之前的行為,您可以將 設定 spark.sql.analyzer.failAmbiguousSelfJoinfalse
  • 在 Spark 3.0 中,以科學表示法撰寫的數位會 1E2剖析為 Double。 在 Spark 2.4 版和以下版本中,它們會剖析為 Decimal。 若要還原 Spark 3.0 前的行為,您可以將 設定 spark.sql.legacy.exponentLiteralAsDecimal.enabledtrue
  • 在Spark 3.0中,組態 spark.sql.crossJoin.enabled 會變成內部組態,且預設為 true。 根據預設,Spark 不會在具有隱含交叉聯結的 SQL 上引發例外狀況。
  • 在Spark 2.4版和以下版本中,float/double -0.0在語意上等於0.0,但在匯總群組索引鍵、視窗分割索引鍵和聯結索引鍵時,會將 -0.0和0.0.0視為不同的值。 在Spark 3.0中,已修正此錯誤。 例如, Seq(-0.0, 0.0).toDF("d").groupBy("d").count()[(0.0, 2)] Spark 3.0 和 [(0.0, 1), (-0.0, 1)] Spark 2.4 和以下的 中傳回 。
  • 在Spark 3.0中, TIMESTAMP 常值會使用SQL組態 spark.sql.session.timeZone轉換成字串。 在 Spark 2.4 版和以下版本中,轉換會使用 Java 虛擬機的預設時區。
  • 在Spark 3.0中,Spark會StringDate/Timestamp轉換成二進位比較與日期/時間戳。 將 設定spark.sql.legacy.typeCoercion.datetimeToString.enabledtrue為 ,即可還原轉換成 StringDate/Timestamp先前行為。
  • 在 Spark 2.4 版和以下版本中,函式中 from_utc_timestamp 會以無訊息方式忽略無效的時區標識符,並以 GMT 時區取代。 在Spark 3.0中,這類時區標識碼會遭到拒絕,Spark 會 java.time.DateTimeException擲回 。
  • 在Spark 3.0中,Proleptic公曆用於剖析、格式化和轉換日期和時間戳,以及擷取年、日等子元件。 Spark 3.0 會使用以 ISO 計時為基礎的 java.time 套件中的 Java 8 API 類別。 在Spark 2.4版和以下版本中,這些作業是使用混合式行事曆執行(Julian + 公曆)。 這些變更會影響 1582 年 10 月 15 日之前日期的結果,並影響下列 Spark 3.0 API:
    • 剖析/格式化時間戳/日期字串。 當使用者指定的模式用於剖析和格式化時,這會對 CSV/JSON 數據源和 、date_formatto_unix_timestampfrom_unixtimeto_dateto_timestamp 函式造成unix_timestamp影響。 在Spark 3.0中,我們會在中 sql-ref-datetime-pattern.md定義自己的模式字串,其會透過 java.time.format.DateTimeFormatter 底下實作。 新的實作會對其輸入執行嚴格的檢查。 例如, 2015-07-22 10:00:00 如果模式是 yyyy-MM-dd ,則時間戳無法剖析,因為剖析器不會取用整個輸入。 另一個範例是 31/01/2015 00:00 模式無法剖析 dd/MM/yyyy hh:mm 輸入,因為 hh presupposs hours in the range 1-12. 在Spark 2.4版和以下版本中,java.text.SimpleDateFormat會用於時間戳/日期字串轉換,且支援的模式會在simpleDateFormat描述。 舊的行為可以藉由將 設定 spark.sql.legacy.timeParserPolicyLEGACY來還原。
    • weekofyearweekdaydayofweek、、date_truncfrom_utc_timestampto_utc_timestamp和 函unix_timestamp式會使用 java.time API 來計算年份的周數、星期數,以及從 TimestampType UTC 時區轉換成值。
    • JDBC 選項 lowerBoundupperBound 會以將字串轉換成 TimestampType/DateType 值的相同方式轉換成 TimestampType/DateType 值。 轉換是以 Proleptic 公曆為基礎,以及 SQL 設定 spark.sql.session.timeZone所定義的時區。 在Spark 2.4版和以下版本中,轉換是以混合式行事曆 (Julian + 公曆) 和預設系統時區為基礎。
    • 格式化 TIMESTAMPDATE 常值。
    • 從字串建立具型 TIMESTAMP 別和 DATE 常值。 在Spark 3.0中,字串轉換成具類型的 TIMESTAMP/DATE 常值會透過轉換成 TIMESTAMP/DATE 值來執行。 例如, TIMESTAMP '2019-12-23 12:59:30' 語意等於 CAST('2019-12-23 12:59:30' AS TIMESTAMP)。 當輸入字串不包含時區的相關信息時,就會在該情況下使用 SQL 組態 spark.sql.session.timeZone 中的時區。 在Spark 2.4版和以下版本中,轉換是以JVM系統時區為基礎。 默認時區的不同來源可能會變更具 TIMESTAMP 型別和 DATE 常值的行為。

Apache Hive

  • 在Spark 3.0中,我們已將內建Hive版本從1.2升級至2.3,這會產生下列影響:
    • 您可能需要根據您要連線的 Hive 中繼存放區版本來設定 spark.sql.hive.metastore.versionspark.sql.hive.metastore.jars 。 例如:如果 Hive 中繼存放區版本是 1.2.1,請將 設定 spark.sql.hive.metastore.version1.2.1spark.sql.hive.metastore.jarsmaven
    • 您需要將自定義 SerDes 移轉至 Hive 2.3,或使用設定檔建置您自己的 Spark hive-1.2 。 如需詳細資訊,請參閱 HIVE-15167
    • 當在 SQL 中使用 運算符進行腳本轉換時,Hive 1.2 和 Hive 2.3 之間的 TRANSFORM 十進位字串表示法可能會不同,這取決於 Hive 的行為。 在Hive 1.2中,字串表示會省略尾端零。 但在Hive 2.3中,如有必要,它一律會填補為18個數字,結尾為零。
    • 在 Databricks Runtime 7.x 中,讀取 Hive SerDe 數據表時,根據預設,Spark 不允許在不是數據表分割的子目錄下讀取檔案。 若要開啟它,請將組態 spark.databricks.io.hive.scanNonpartitionedDirectory.enabled 設定為 true。 這不會影響 Spark 原生數據表讀取器和檔案讀取器。

MLlib

  • OneHotEncoder在 2.3 中已被取代,在 3.0 中移除,現在 OneHotEncoderEstimator 已重新命名為 OneHotEncoder
  • org.apache.spark.ml.image.ImageSchema.readImages在 2.3 中已被取代,在 3.0 中移除。 請改用 spark.read.format('image')
  • org.apache.spark.mllib.clustering.KMeans.train 搭配 param Int runs,在 2.1 中已被取代,會在 3.0 中移除。 請改用定型方法而不執行。
  • org.apache.spark.mllib.classification.LogisticRegressionWithSGD在 2.0 中已被取代的 ,會在 3.0 中移除,請改用 org.apache.spark.ml.classification.LogisticRegressionspark.mllib.classification.LogisticRegressionWithLBFGS
  • org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted在 2.1 中已被取代,在 3.0 中移除,不適用於子類別使用。
  • org.apache.spark.mllib.regression.RidgeRegressionWithSGD在 2.0 中已被取代的 ,會在 3.0 中移除。 搭配 elasticNetParam = 0.0使用 org.apache.spark.ml.regression.LinearRegression 。 請注意,的RidgeRegressionWithSGD預設值為0.01,但的預設值regParamLinearRegression0.0。
  • org.apache.spark.mllib.regression.LassoWithSGD在 2.0 中已被取代的 ,會在 3.0 中移除。 搭配 elasticNetParam = 1.0使用 org.apache.spark.ml.regression.LinearRegression 。 請注意,的LassoWithSGD預設值為0.01,但的預設值regParamLinearRegression0.0。
  • org.apache.spark.mllib.regression.LinearRegressionWithSGD在 2.0 中已被取代的 ,會在 3.0 中移除。 請改用 org.apache.spark.ml.regression.LinearRegressionLBFGS
  • org.apache.spark.mllib.clustering.KMeans.getRunssetRuns,在 2.1 中已被取代,會在 3.0 中移除,而且自 Spark 2.0.0 起沒有任何作用。
  • org.apache.spark.ml.LinearSVCModel.setWeightCol在 2.4 中已被取代,在 3.0 中移除,不適用於使用者。
  • 在 3.0 中, org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel 擴充 MultilayerPerceptronParams 以公開訓練參數。 因此,layers中的 已從 Array[Int] 變更為 IntArrayParamMultilayerPerceptronClassificationModel 。 您應該使用 MultilayerPerceptronClassificationModel.getLayers 而不是 MultilayerPerceptronClassificationModel.layers 來擷取圖層的大小。
  • org.apache.spark.ml.classification.GBTClassifier.numTrees在 2.4.5 中已被取代,在 3.0 中移除。 請改用 getNumTrees
  • org.apache.spark.ml.clustering.KMeansModel.computeCost在 2.4 中已被取代,在 3.0 中移除,請改用 ClusteringEvaluator
  • 中的 org.apache.spark.mllib.evaluation.MulticlassMetrics成員變數有效位數在 2.0 中已被取代,會在 3.0 中移除。 請改用精確度。
  • 中的 org.apache.spark.mllib.evaluation.MulticlassMetrics成員變數召回,在 2.0 中已被取代,會在 3.0 中移除。 請改用 accuracy
  • 中的org.apache.spark.mllib.evaluation.MulticlassMetrics成員變數fMeasure在 2.0 中已被取代,會在 3.0 中移除。 請改用 accuracy
  • org.apache.spark.ml.util.GeneralMLWriter.context在 2.0 中已被取代的 ,會在 3.0 中移除。 請改用 session
  • org.apache.spark.ml.util.MLWriter.context在 2.0 中已被取代的 ,會在 3.0 中移除。 請改用 session
  • org.apache.spark.ml.util.MLReader.context在 2.0 中已被取代的 ,會在 3.0 中移除。 請改用 session
  • abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]] 在 3.0 中會變更為 abstract class UnaryTransformer[IN: TypeTag, OUT: TypeTag, T <: UnaryTransformer[IN, OUT, T]]
  • 在Spark 3.0中,Pyspark中的多類別羅吉斯回歸現在會傳回 LogisticRegressionSummary,而不是子類別 BinaryLogisticRegressionSummary。 無論如何,所 BinaryLogisticRegressionSummary 公開的其他方法將無法在此案例中運作。 (SPARK-31681
  • 在Spark 3.0中, pyspark.ml.param.shared.Has* mixins 不再提供任何 set*(self, value) setter 方法,請改用個別 self.set(self.*, value) 方法。 如需詳細資訊,請參閱SPARK-29093。 (SPARK-29093

其他行為變更

  • 升級至 Scala 2.12 涉及下列變更:

    • 封裝數據格串行化會以不同的方式處理。 下列範例說明行為變更及其處理方式。

      執行 foo.bar.MyObjectInPackageCell.run() 如下列封裝數據格中所定義,將會觸發錯誤 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)
        }
      }
      

      若要解決此錯誤,您可以在可串行化類別內包裝 MyObjectInPackageCell

    • 使用 DataStreamWriter.foreachBatch 的某些案例需要原始程式碼更新。 這項變更是因為 Scala 2.12 已從 Lambda 運算式自動轉換成 SAM 類型,而且可能會導致模棱兩可。

      例如,下列 Scala 程式代碼無法編譯:

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

      若要修正編譯錯誤,請明確變更 foreachBatch { (df, id) => myFunc(df, id) } 或使用 foreachBatch(myFunc _) JaVA API: foreachBatch(new VoidFunction2 ...)

  • 因為用來處理 Hive 使用者定義函式和 Hive SerDes 的 Apache Hive 版本已升級為 2.3,因此需要兩個變更:

    • Hive 的 SerDe 介面會由抽象類 AbstractSerDe取代。 針對任何自訂 Hive SerDe 實作,需要移轉至 AbstractSerDe
    • 設定 spark.sql.hive.metastore.jarsbuiltin 表示Hive 2.3中繼存放區用戶端將用來存取 Databricks Runtime 7.x 的中繼存放區。 如果您需要存取Hive 1.2型外部中繼存放區,請將 設定 spark.sql.hive.metastore.jars 為包含Hive 1.2 jar的資料夾。

取代和移除

  • Databricks Runtime 4.3 中已取代略過索引的數據,並在 Databricks Runtime 7.x 中移除。 建議您改用 Delta 數據表,以提供 改善的數據略過功能
  • 在 Databricks Runtime 7.x 中,Apache Spark 的基礎版本使用 Scala 2.12。 由於針對 Scala 2.11 編譯的連結庫可以非預期的方式停用 Databricks Runtime 7.x 叢集,因此執行 Databricks Runtime 7.x 的叢集不會安裝設定為安裝在所有叢集上的連結庫。 [叢集連結 ] 索引標籤會顯示狀態 Skipped 和取代訊息,說明連結庫處理中的變更。 不過,如果您在 Azure Databricks 平臺 3.20 版發行至工作區之前,已在舊版 Databricks Runtime 上建立叢集,而您現在編輯該叢集以使用 Databricks Runtime 7.x,則所有叢集上設定要安裝的連結庫都會安裝在該叢集上。 在此情況下,已安裝連結庫中任何不相容的 JAR 都可能導致叢集停用。 因應措施是複製叢集或建立新的叢集。

已知問題

  • 使用模式字母 『D』 剖析年份的日期會傳回錯誤的結果,如果遺漏年份欄位。 這可能發生在 SQL 函式中,例如 to_timestamp 使用模式字串將 datetime 字串剖析為 datetime 值。 (SPARK-31939
  • 如果索引鍵有 -0.0 和 0.0 值,則子查詢內的聯結/視窗/匯總可能會導致錯誤的結果。 (SPARK-31958
  • 窗口查詢可能會意外失敗,並出現模棱兩可的自我聯結錯誤。 (SPARK-31956
  • 使用運算符串 dropDuplicates 流查詢可能無法使用 Spark 2.x 所撰寫的檢查點重新啟動。 (SPARK-31990