Databricks Runtime 7.x の移行ガイド (EoS)
Note
この Databricks Runtime バージョンのサポートは終了しました。 サポート終了日については、「サポート終了の履歴」を参照してください。 サポートされている Databricks Runtime のすべてのバージョンについては、「Databricks Runtime リリース ノートのバージョンと互換性」を参照してください。
このガイドでは、Apache Spark 2.4 上に構築された Databricks Runtime 6.x から、Spark 3.0 上に構築された Databricks Runtime 7.3 LTS (EoS) に、Azure Databricks のワークロードを移行するために役立つガイダンスを提供します。
このガイドに記載されている Spark 3.0 の動作の変更点により、Azure Databricks のワークロードの更新が必要になる場合があります。 それらの変更点には、Python 2 のサポートの完全な廃止、Scala 2.12 へのアップグレード、JDK 11 の完全なサポート、日付とタイムスタンプのグレゴリオ暦から先発グレゴリオ暦への切り替えが含まれます。
このガイドは、「Databricks Runtime 7.3 LTS (EoS) の移行ガイド」の手引きになります。
Databricks Runtime 7.x で利用できる新機能と機能強化
Databricks Runtime 7.3 LTS に含まれる新機能、機能強化、ライブラリ アップグレードの一覧については、移行元よりも上位の各 Databricks Runtime バージョンのリリース ノートを参照してください。 サポートされている Databricks Runtime 7.x バージョンは次のとおりです。
リリース後のメンテナンス更新プログラムは、「Databricks ランタイムのメンテナンス更新プログラム (アーカイブ済み)」に記載されています。
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 の動作の主な変更点
Spark 2.4 と Spark 3.0 の間で次の動作が変更されたため、Databricks Runtime 6.x から Databricks Runtime 7.x に移行するときに、Azure Databricks のワークロードの更新が必要になる場合があります。
注意
この記事では、Databricks Runtime 7.x に移行するときに考慮すべき重要な Spark の動作の変更点の一覧を示します。
コア
- Spark 3.0 では、非推奨のアキュムレータ v1 が削除されています。
- イベント ログ ファイルは UTF-8 エンコードとして書き込まれ、Spark History Server はイベント ログ ファイルを UTF-8 エンコードとして再生します。 従来、Spark は、イベント ログ ファイルをドライバー JVM プロセスの既定の文字セットとして書き込んでいました。そのため、エンコードに互換性がない場合は、以前のイベント ログ ファイルを読み取るために、Spark 2.x の Spark History Server が必要です。
- シャッフル ブロックをフェッチするための新しいプロトコルが使用されます。 Spark 3.0 アプリを実行する場合は、外部シャッフル サービスをアップグレードすることをお勧めします。 構成
spark.shuffle.useOldFetchProtocol
をtrue
に設定すると、以前の外部シャッフル サービスを引き続き使用できます。 そうしないと、Spark でエラーが発生して、IllegalArgumentException: Unexpected message type: <number>
のようなメッセージが出力される可能性があります。
PySpark
- Spark 3.0 では、
Column.apply
を呼び出さないようにColumn.getItem
が固定されています。 そのため、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
に設定します。 この環境変数は、すべての実行プログラムとドライバーで一貫している必要があります。 そうしないと、エラーや正しくない応答が発生する可能性があります。 Python バージョンが 3.6 未満である場合は、唯一のオプションとして、フィールド名がアルファベット順に並べ替えられます。 - Python 2 のサポートが廃止されました (SPARK-27884)。
構造化ストリーミング
- Spark 3.0 では、テキスト、json、csv、parquet、orc などのファイルベースのデータソースが
spark.readStream(...)
を介して使用されている場合、ソース スキーマは、構造化ストリーミングによって強制的に null 許容になります。 従来、ソース スキーマでは null 値の許容が尊重されていました。しかし、それによって、NPE でのデバッグが難しい問題が発生していました。 以前の動作を復元するには、spark.sql.streaming.fileSource.schema.forceNullable
をfalse
に設定します。 - Spark 3.0 では、ストリーム同士の外部結合での正確さの問題が修正され、それによって状態のスキーマが変更されます。 詳細については、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、Dataset、DataFrame
- Spark 3.0 では、異なるデータ型を持つテーブル列に値を挿入する場合、型の強制変換は、ANSI SQL 標準に従って実行されます。
string
からint
への変換やdouble
からboolean
への変換など、特定の不当な型変換は禁止されています。 値が列のデータ型の範囲外である場合は、ランタイム例外がスローされます。 Spark バージョン 2.4 以前では、テーブル挿入中の型変換は、有効なCast
である限り許可されます。 整数フィールドに範囲外の値を挿入すると、値の低位ビットが挿入されます (Java/Scala 数値型キャストと同じです)。 たとえば、バイト型のフィールドに 257 が挿入された場合、結果は 1 です。 動作はオプションspark.sql.storeAssignmentPolicy
によって制御され、既定値は "ANSI" です。 オプションを "Legacy" に設定すると、以前の動作が復元されます。 - Spark 3.0 では、文字列値を整数型 (tinyint、smallint、int、bigint)、日時型 (date、timestamp、interval)、ブール型にキャストするときには、先頭と末尾の空白文字 (<= ACSII 32) は、これらの型の値に変換される前にトリミングされます。たとえば、
cast(' 1\t' as int)
は1
を返し、cast(' 1\t' as boolean)
はtrue
を返し、cast('2019-10-10\t as date)
は date 値2019-10-10
を返します。 Spark バージョン 2.4 以前では、文字列を整数とブール値にキャストするときには、両端の空白文字はトリミングされず、前述の結果はnull
です。一方、日時にキャストするときには、末尾のスペース (= ASCII 32) のみが削除されます。 [https://docs.microsoft.com/azure/active-directory/develop/scenario-protected-web-api-overview](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 以降、Dataset と DataFrame の API
unionAll
は非推奨ではなくなります。 これはunion
の別名です。 - Spark バージョン 2.4 以前では、JSON データ ソースのパーサーは、
IntegerType
などの一部のデータ型に対して空の文字列を null 値として扱います。FloatType
とDoubleType
の場合は、空の文字列で失敗し、例外がスローされます。 Spark 3.0 以降、空の文字列は禁止され、StringType
とBinaryType
を除くデータ型に対して例外がスローされます。 - Spark 3.0 以降、
from_json
関数は、2 つのモードPERMISSIVE
とFAILFAST
をサポートしています。 モードは、mode
オプションを使用して設定できます。 既定のモードはPERMISSIVE
になりました。 以前のバージョンでは、from_json
の動作は、正しくない形式の JSON レコードの処理では特に、PERMISSIVE
にもFAILFAST,
にも準拠していませんでした。 たとえば、スキーマ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.enabled
をtrue
に設定できます。 - Spark 3.0 では、異なるデータ型を持つテーブル列に値を挿入する場合、型の強制変換は、ANSI SQL 標準に従って実行されます。
string
からint
への変換やdouble
からboolean
への変換など、特定の不当な型変換は禁止されています。 値が列のデータ型の範囲外である場合は、ランタイム例外がスローされます。 Spark バージョン 2.4 以前では、テーブル挿入中の型変換は、有効なCast
である限り許可されます。 整数フィールドに範囲外の値を挿入すると、値の低位ビットが挿入されます (Java/Scala 数値型キャストと同じです)。 たとえば、バイト型のフィールドに 257 が挿入された場合、結果は 1 です。 動作はオプションspark.sql.storeAssignmentPolicy
によって制御され、既定値は "ANSI" です。 オプションを "Legacy" として設定すると、以前の動作が復元されます。 - Spark 3.0 では、指定されたテーブルが Hive SerDe テーブルである場合でも、
SHOW CREATE TABLE
は常に Spark DDL を返します。 Hive DDL を生成するには、代わりにSHOW CREATE TABLE AS SERDE
コマンドを使用します。 - Spark 3.0 では、Hive-Serde 以外のテーブルでは
CHAR
型の列は許可されません。CHAR
型が検出されると、CREATE/ALTER TABLE
コマンドは失敗します。 代わりにSTRING
型を使用してください。 Spark バージョン 2.4 以前では、CHAR
型はSTRING
型として扱われ、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 では、UDF は、入力値が null である場合に Java 型の既定値を返します。 たとえば、val f = udf((x: Int) => x, IntegerType), f($"x")
は、列 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 データ ソースのパーサーは、
IntegerType
などの一部のデータ型に対して空の文字列を null 値として扱います。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
中) にのみ適用されることに注意してください。変更点の要点は、クエリの実行時だけでなく、テーブル ファイルの一覧表示中とクエリの計画中にもspark.sql.files.ignoreMissingFiles
に従うようになったことです。 - Spark バージョン 2.4 以前では、CSV データソースは、正しくない形式の CSV 文字列を、PERMISSIVE モードではすべてが null である行に変換します。 Spark 3.0 では、一部の CSV 列値が解析され、目的の型に正常に変換された場合は、返される行に null 以外のフィールドが含まれていることがあります。
- Spark 3.0 では、
TIMESTAMP
列の保存中に、parquet 論理型TIMESTAMP_MICROS
が既定で使用されます。 Spark バージョン 2.4 以前では、TIMESTAMP
列は、parquet ファイルにINT96
として保存されます。 Hive 1.x や Impala 2.x などの一部の SQL システムでは、INT96 タイムスタンプのみが読み取り可能であることに注意してください。spark.sql.parquet.outputTimestampType
をINT96
として設定すると、以前の動作を復元し、相互運用性を維持することができます。 - Spark 3.0 では、Avro ファイルがユーザー指定のスキーマを使用して書き込まれると、フィールドは、Catalyst スキーマと Avro スキーマの間で、位置の代わりにフィールド名によって照合されます。
クエリ エンジン
- Spark 3.0 では、自己結合によって発生するあいまいな列参照が含まれている場合、Dataset クエリは失敗します。 一般的な例:
val df1 = ...; val df2 = df1.filter(...);, then df1.join(df2, df1("a") > df2("a"))
は、非常に分かりにくい空の結果を返します。 これは、自己結合されているテーブルを指す Dataset 列参照を Spark が解決できないため、そしてdf1("a")
が Spark 内のdf2("a")
と完全に同じであるためです。 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 は異なる値であると見なされます。 Spark 3.0 では、このバグが修正されています。 たとえば、
Seq(-0.0, 0.0).toDF("d").groupBy("d").count()
は、Spark 3.0 では[(0.0, 2)]
を、Spark 2.4 以前では[(0.0, 1), (-0.0, 1)]
を返します。 - Spark 3.0 では、
TIMESTAMP
リテラルは、SQL 構成spark.sql.session.timeZone
を使用して文字列に変換されます。 Spark バージョン 2.4 以前では、変換には、Java 仮想マシンの既定のタイム ゾーンが使用されます。 - Spark 3.0 では、Spark は、日付/タイムスタンプとのバイナリ比較で
String
をDate/Timestamp
にキャストします。spark.sql.legacy.typeCoercion.datetimeToString.enabled
をtrue
に設定すると、以前の動作を復元して、Date/Timestamp
をString
にキャストできます。 - Spark バージョン 2.4 以前では、たとえば
from_utc_timestamp
関数で、無効なタイム ゾーン ID は単に無視され、GMT タイム ゾーンによって置き換えられます。 Spark 3.0 では、このようなタイム ゾーン ID は拒否され、Spark はjava.time.DateTimeException
をスローします。 - Spark 3.0 では、日付とタイムスタンプの解析、書式設定、変換と、年や日などのサブコンポーネントの抽出に、先発グレゴリオ暦が使用されます。 Spark 3.0 では、ISO 時系列に基づいた java.time パッケージからの Java 8 API クラスが使用されます。 Spark バージョン 2.4 以前では、これらの操作は、ハイブリッド カレンダー (ユリウス暦 + グレゴリオ暦) を使用して実行されます。 これらの変更は、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
を使用して実装されます。 新しい実装は、その入力の厳密なチェックを実行します。 たとえば、パターンがyyyy-MM-dd
である場合は、パーサーが入力全体を使用しないため、2015-07-22 10:00:00
タイムスタンプを解析できません。 もう 1 つの例は、hh
が 1 から 12 の範囲の時間を事前に想定しているため、31/01/2015 00:00
入力をdd/MM/yyyy hh:mm
パターンによって解析できない場合です。 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 を使用して、年の週番号と週の曜日番号を計算し、UTC タイム ゾーンでのTimestampType
値との変換を実行します。- JDBC オプション
lowerBound
とupperBound
は、文字列を TimestampType/DateType 値にキャストするのと同じ方法で、TimestampType/DateType 値に変換されます。 変換は、先発グレゴリオ暦と、SQL 構成spark.sql.session.timeZone
によって定義されたタイム ゾーンに基づいて行われます。 Spark バージョン 2.4 以前では、変換は、ハイブリッド カレンダー (ユリウス暦 + グレゴリオ暦) と、既定のシステム タイム ゾーンに基づいて行われます。 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 に移行するか、
hive-1.2
プロファイルを使用して独自の Spark を構築する必要があります。 詳細については、HIVE-15167 を参照してください。 - スクリプト変換に SQL 内の
TRANSFORM
演算子を使用する場合、Hive 1.2 と Hive 2.3 では、10 進数の文字列表現が異なることがあります。これは 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 で削除されました。 代わりに runs なしの train メソッドを使用してください。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
は、RidgeRegressionWithSGD
の場合は 0.01 ですが、LinearRegression
の場合は 0.0 であることに注意してください。org.apache.spark.mllib.regression.LassoWithSGD
は、2.0 で非推奨になり、3.0 で削除されました。org.apache.spark.ml.regression.LinearRegression
とelasticNetParam = 1.0
の組み合わせを使用してください。 既定のregParam
は、LassoWithSGD
の場合は 0.01 ですが、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
を拡張して、トレーニング パラメーターを公開します。 その結果、MultilayerPerceptronClassificationModel
内のlayers
がArray[Int]
からIntArrayParam
に変更されました。 レイヤーのサイズを取得するには、MultilayerPerceptronClassificationModel.layers
の代わりにMultilayerPerceptronClassificationModel.getLayers
を使用する必要があります。 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
内のメンバー変数 precision は、2.0 で非推奨になり、3.0 で削除されました。 代わりに accuracy を使用してください。org.apache.spark.mllib.evaluation.MulticlassMetrics
内のメンバー変数 recall は、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 内の多クラス ロジスティック回帰は、サブクラス
BinaryLogisticRegressionSummary
ではなく、LogisticRegressionSummary
を (正しく) 返すようになりました。BinaryLogisticRegressionSummary
によって公開される追加のメソッドは、この場合、いずれにしても機能しません。 (SPARK-31681) - Spark 3.0 では、
pyspark.ml.param.shared.Has*
mixin は、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 ではラムダ式から SAM 型への自動変換が行われるため、あいまいさが発生する可能性があるという事実に起因します。たとえば、次の Scala コードはコンパイルできません。
streams .writeStream .foreachBatch { (df, id) => myFunc(df, id) }
コンパイル エラーを修正するには、
foreachBatch { (df, id) => myFunc(df, id) }
をforeachBatch(myFunc _)
に変更するか、foreachBatch(new VoidFunction2 ...)
のように Java API を明示的に使用します。
Hive ユーザー定義関数と Hive SerDes の処理に使用される Apache Hive バージョンが 2.3 にアップグレードされるため、次の 2 つの変更が必要になります。
- Hive の
SerDe
インターフェイスが抽象クラスAbstractSerDe
によって置き換えられます。 すべてのカスタム HiveSerDe
実装で、AbstractSerDe
への移行が必要です。 spark.sql.hive.metastore.jars
をbuiltin
に設定すると、Databricks Runtime 7.x のメタストアにアクセスするために、Hive 2.3 メタストア クライアントが使用されます。 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’ を使用して年の通日を解析すると、年フィールドがない場合は、間違った結果が返されます。 これは、パターン文字列を使用して datetime 文字列を datetime 値に解析する
to_timestamp
などの SQL 関数で発生する可能性があります。 (SPARK-31939) - サブクエリの内部で結合/ウィンドウ/集計を実行すると、キーの値が-0.0 と0.0 である場合に、間違った結果が返されることがあります。 (SPARK-31958)
- あいまいな自己結合エラーが原因で、予期しない動作によってウィンドウ クエリが失敗することがあります。 (SPARK-31956)
dropDuplicates
演算子を含むストリーミング クエリは、Spark 2.x によって記述されたチェックポイントでは、再開できないことがあります。 (SPARK-31990)