Databricks Runtime 7.x 移轉指南 (EoS)
注意
針對此 Databricks Runtime 版本的支援已結束。 如需了解終止支援日期,請參閱終止支援歷程記錄。 如需所有支援的 Databricks Runtime 版本,請參閱 Databricks Runtime 發行說明版本與相容性。
本指南提供指引,協助您將 Azure Databricks 工作負載從以 Apache Spark 2.4 建置的 Databricks Runtime 6.x 遷移至 Databricks Runtime 7.3 LTS (EoS),這兩者都是建置在 Spark 3.0 上。
本指南列出 可能需要更新 Azure Databricks 工作負載的 Spark 3.0 行為變更 。 其中一些變更包括完整移除 Python 2 支援、升級至 Scala 2.12、JDK 11 的完整支援,以及從公曆切換至日期和時間時間戳的 Proleptic 行事曆。
本指南是 Databricks Runtime 7.3 LTS (EoS) 移轉指南的隨附。
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中,已移除已被取代的累積器 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.forceNullable
設定為false
。 - 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標準執行類型強制。 不允許某些不合理的類型轉換,例如轉換成
string
int
和double
boolean
。 如果數據行數據類型的值超出範圍,則會擲回運行時間例外狀況。 在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)
傳回 、傳回1
cast(' 1\t' as boolean)
true
、cast('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>
之類的FROM <table> UNION ALL 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
針對FloatType
和DoubleType
,它會在空字串上失敗,並擲回例外狀況。 由於 Spark 3.0,我們不允許空字串串,而且會針對和 以外的StringType
BinaryType
數據類型擲回例外狀況。 - 由於 Spark 3.0,函
from_json
式支援兩種模式 -PERMISSIVE
和FAILFAST
。 模式可以透過mode
選項來設定。 預設模式會變成PERMISSIVE
。 在舊版中,的行為from_json
不符合PERMISSIVE
或FAILFAST,
特別是在處理格式不正確的 JSON 記錄時。 例如,具有架構{"a" 1}
的 JSON 字串a INT
會由舊版轉換成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.enabled
為true
。 - 在Spark 3.0中,將值插入具有不同數據類型的數據表數據行時,會根據ANSI SQL標準執行類型強制。 不允許某些不合理的類型轉換,例如轉換成
string
int
和double
boolean
。 如果數據行數據類型的值超出範圍,則會擲回運行時間例外狀況。 在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 TABLE
CHAR
偵測到類型,命令將會失敗。 請改用STRING
類型。 在Spark 2.4版和以下版本中,CHAR
type 會STRING
被視為 type,而且只會忽略 length 參數。
UDF 和內建函式
- 在 Spark 3.0 中,預設不允許使用
org.apache.spark.sql.functions.udf(AnyRef, DataType)
。 設定spark.sql.legacy.allowUntypedScalaUDF
為true
以繼續使用。 在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版和以下版本中,您可以透過、
CreateMap
等內建函StringToMap
式建立具有重複索引鍵的對應。未定義具有重複索引鍵的對應行為,例如,地圖查閱會先顯示重複的索引鍵,只保留重複的索引鍵最後出現、Dataset.collect
MapKeys
傳回重複的索引鍵等等。在Spark 3.0中,找到重複的索引鍵時,Spark 會RuntimeException
擲回。 您可以使用最後一個勝利原則,將 設定spark.sql.mapKeyDedupPolicy
為LAST_WIN
重複資料刪除對應金鑰。 使用者仍然可以從未強制執行的數據源讀取具有重複索引鍵的對應值(例如 Parquet),行為是未定義的。
資料來源
- 在Spark 2.4版和以下版本中,如果無法轉換成對應的使用者提供的架構,分割區數據行值會轉換成 null。 在 3.0 中,數據分割資料行值會以使用者提供的架構進行驗證。 如果驗證失敗,則會擲回例外狀況。 您可以將 設定
spark.sql.sources.validatePartitionColumns
為false
來停用這類驗證。 - 在Spark 2.4版和以下版本中,JSON數據源的剖析器會將空字串視為 Null,例如 。
IntegerType
針對FloatType
、DoubleType
DateType
和TimestampType
,它會在空字串上失敗,並擲回例外狀況。 Spark 3.0 不允許空字串,而且會針對和 以外的StringType
BinaryType
數據類型擲回例外狀況。 將 設定spark.sql.legacy.json.allowEmptyString.enabled
true
為 ,即可還原允許空字串的先前行為。 - 在 Spark 3.0 中,如果檔案或子目錄在遞歸目錄清單期間消失(亦即,它們會出現在中繼清單中,但在遞歸目錄清單的後續階段無法讀取或列出,因為
spark.sql.files.ignoreMissingFiles
true
並行檔案刪除或物件存放區一致性問題),除非是 (預設值 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.outputTimestampType
INT96
為 以還原先前的行為並保留互操作性。 - 在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.failAmbiguousSelfJoin
為false
。 - 在 Spark 3.0 中,以科學表示法撰寫的數位會
1E2
剖析為Double
。 在 Spark 2.4 版和以下版本中,它們會剖析為Decimal
。 若要還原 Spark 3.0 前的行為,您可以將 設定spark.sql.legacy.exponentLiteralAsDecimal.enabled
為true
。 - 在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會
String
Date/Timestamp
轉換成二進位比較與日期/時間戳。 將 設定Date/Timestamp
String
為 ,即可還原轉換成spark.sql.legacy.typeCoercion.datetimeToString.enabled
的true
先前行為。 - 在 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 數據源和 、
unix_timestamp
、date_format
to_unix_timestamp
、from_unixtime
、to_date
函式造成to_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.timeParserPolicy
為LEGACY
來還原。 -
weekofyear
、weekday
、dayofweek
、、date_trunc
、from_utc_timestamp
、to_utc_timestamp
和 函unix_timestamp
式會使用java.time
API 來計算年份的周數、星期數,以及從TimestampType
UTC 時區轉換成值。 - JDBC 選項
lowerBound
和upperBound
會以將字串轉換成 TimestampType/DateType 值的相同方式轉換成 TimestampType/DateType 值。 轉換是以 Proleptic 公曆為基礎,以及 SQL 設定spark.sql.session.timeZone
所定義的時區。 在Spark 2.4版和以下版本中,轉換是以混合式行事曆 (Julian + 公曆) 和預設系統時區為基礎。 - 格式化
TIMESTAMP
和DATE
常值。 - 從字串建立具型
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
常值的行為。
- 剖析/格式化時間戳/日期字串。 當使用者指定的模式用於剖析和格式化時,這會對 CSV/JSON 數據源和 、
Apache Hive
- 在Spark 3.0中,我們已將內建Hive版本從1.2升級至2.3,這會產生下列影響:
- 您可能需要根據您要連線的 Hive 中繼存放區版本來設定
spark.sql.hive.metastore.version
和spark.sql.hive.metastore.jars
。 例如:如果 Hive 中繼存放區版本是 1.2.1,請將 設定spark.sql.hive.metastore.version
為1.2.1
和spark.sql.hive.metastore.jars
maven
。 - 您需要將自定義 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 原生數據表讀取器和檔案讀取器。
- 您可能需要根據您要連線的 Hive 中繼存放區版本來設定
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 Intruns
,在 2.1 中已被取代,會在 3.0 中移除。 請改用定型方法而不執行。 -
org.apache.spark.mllib.classification.LogisticRegressionWithSGD
在 2.0 中已被取代的 ,會在 3.0 中移除,請改用org.apache.spark.ml.classification.LogisticRegression
或spark.mllib.classification.LogisticRegressionWithLBFGS
。 -
org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted
在 2.1 中已被取代,在 3.0 中移除,不適用於子類別使用。 -
org.apache.spark.mllib.regression.RidgeRegressionWithSGD
在 2.0 中已被取代的 ,會在 3.0 中移除。 搭配org.apache.spark.ml.regression.LinearRegression
使用elasticNetParam = 0.0
。 請注意,的regParam
預設值為0.01,但的預設值RidgeRegressionWithSGD
為LinearRegression
0.0。 -
org.apache.spark.mllib.regression.LassoWithSGD
在 2.0 中已被取代的 ,會在 3.0 中移除。 搭配org.apache.spark.ml.regression.LinearRegression
使用elasticNetParam = 1.0
。 請注意,的regParam
預設值為0.01,但的預設值LassoWithSGD
為LinearRegression
0.0。 -
org.apache.spark.mllib.regression.LinearRegressionWithSGD
在 2.0 中已被取代的 ,會在 3.0 中移除。 請改用org.apache.spark.ml.regression.LinearRegression
或LBFGS
。 -
org.apache.spark.mllib.clustering.KMeans.getRuns
和setRuns
,在 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
中的 已從MultilayerPerceptronClassificationModel
變更為Array[Int]
IntArrayParam
。 您應該使用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
。 - 中的
fMeasure
成員變數org.apache.spark.mllib.evaluation.MulticlassMetrics
在 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
取代。 針對任何自訂 HiveSerDe
實作,需要移轉至AbstractSerDe
。 - 設定
spark.sql.hive.metastore.jars
為builtin
表示Hive 2.3中繼存放區用戶端將用來存取 Databricks Runtime 7.x 的中繼存放區。 如果您需要存取Hive 1.2型外部中繼存放區,請將 設定spark.sql.hive.metastore.jars
為包含Hive 1.2 jar的資料夾。
- Hive 的
取代和移除
- 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)