Databricks Runtime 7.x 移行ガイド (サポート対象外)

このガイドでは、Apache Spark 2.4 上に構築された Databricks Runtime 6.x から、Spark 3.0 上に構築された Databricks Runtime 7.3 LTS (サポート対象外) に、Azure Databricks のワークロードを移行するために役立つガイダンスを提供します。

このガイドに記載されている Spark 3.0 の動作の変更点により、Azure Databricks のワークロードの更新が必要になる場合があります。 それらの変更点には、Python 2 のサポートの完全な廃止、Scala 2.12 へのアップグレード、JDK 11 の完全なサポート、日付とタイムスタンプのグレゴリオ暦から先発グレゴリオ暦への切り替えが含まれます。

このガイドは、「Databricks Runtime 7.3 LTS (サポート対象外) の移行ガイド」の手引きになります。

Databricks Runtime バージョン間の移行の詳細については、「Databricks Runtime の移行ガイド」を参照してください。

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.1 移行ガイド」を参照してください。

コア

  • Spark 3.0 では、非推奨のアキュムレータ v1 が削除されています。
  • イベント ログ ファイルは UTF-8 エンコードとして書き込まれ、Spark History Server はイベント ログ ファイルを UTF-8 エンコードとして再生します。 従来、Spark は、イベント ログ ファイルをドライバー JVM プロセスの既定の文字セットとして書き込んでいました。そのため、エンコードに互換性がない場合は、以前のイベント ログ ファイルを読み取るために、Spark 2.x の Spark History Server が必要です。
  • シャッフル ブロックをフェッチするための新しいプロトコルが使用されます。 Spark 3.0 アプリを実行する場合は、外部シャッフル サービスをアップグレードすることをお勧めします。 構成 spark.shuffle.useOldFetchProtocoltrue に設定すると、以前の外部シャッフル サービスを引き続き使用できます。 そうしないと、Spark でエラーが発生して、IllegalArgumentException: Unexpected message type: <number> のようなメッセージが出力される可能性があります。

PySpark

  • Spark 3.0 では、Column.apply を呼び出さないように Column.getItem が固定されています。 そのため、ColumngetItem への引数として使用される場合は、添字演算子を使用する必要があります。 たとえば、map_col.getItem(col('id'))map_col[col('id')] に置き換える必要があります。
  • Spark 3.0 では、Python バージョン 3.6 以上の名前付き引数を使用して構築するときに、Row フィールド名がアルファベット順に並べ替えられることはなくなりました。フィールドの順序は、入力された順序と一致します。 Spark 2.4 のように、フィールドの並べ替えを既定で有効にするには、実行プログラムとドライバーの両方で環境変数 PYSPARK_ROW_FIELD_SORTING_ENABLEDtrue に設定します。 この環境変数は、すべての実行プログラムとドライバーで一貫している必要があります。 そうしないと、エラーや正しくない応答が発生する可能性があります。 Python バージョンが 3.6 未満である場合は、唯一のオプションとして、フィールド名がアルファベット順に並べ替えられます。
  • Python 2 のサポートが廃止されました (SPARK-27884)。

構造化ストリーミング

  • Spark 3.0 では、テキスト、json、csv、parquet、orc などのファイルベースのデータソースが spark.readStream(...) を介して使用されている場合、ソース スキーマは、構造化ストリーミングによって強制的に null 許容になります。 従来、ソース スキーマでは null 値の許容が尊重されていました。しかし、それによって、NPE でのデバッグが難しい問題が発生していました。 以前の動作を復元するには、spark.sql.streaming.fileSource.schema.forceNullablefalse に設定します。
  • 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.createExternalTableSparkSession.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 値として扱います。 FloatTypeDoubleType の場合は、空の文字列で失敗し、例外がスローされます。 Spark 3.0 以降、空の文字列は禁止され、StringTypeBinaryType を除くデータ型に対して例外がスローされます。
  • Spark 3.0 以降、from_json 関数は、2 つのモード PERMISSIVEFAILFAST をサポートしています。 モードは、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.enabledtrue に設定できます。
  • 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.allowUntypedScalaUDFtrue に設定します。 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 以前では、CreateMapStringToMap などの組み込み関数を使用して、重複キーを含むマップを作成できます。重複キーを含むマップの動作は未定義です。たとえば、マップ検索では最初に出現する重複キーが尊重され、Dataset.collect では最後に出現する重複キーのみが保持され、MapKeys では複数の重複キーが返されます。Spark 3.0 では、Spark は、重複キーが見つかると RuntimeException をスローします。 spark.sql.mapKeyDedupPolicyLAST_WIN に設定すると、最後を優先するポリシーを使用して、マップ キーの重複排除を行うことができます。 ユーザーは引き続き、強制しないデータ ソース (たとえば、Parquet) から重複キーを含むマップ値を読み取ることができます。動作は未定義です。

データ ソース

  • Spark バージョン 2.4 以前では、パーティション列の値は、対応するユーザー指定のスキーマにキャストできない場合、null として変換されます。 3.0 では、パーティション列の値は、ユーザー指定のスキーマを使用して検証されます。 検証が失敗した場合は、例外がスローされます。 spark.sql.sources.validatePartitionColumnsfalse に設定すると、このような検証を無効にすることができます。
  • Spark バージョン 2.4 以前では、JSON データ ソースのパーサーは、IntegerType などの一部のデータ型に対して空の文字列を null 値として扱います。 FloatTypeDoubleTypeDateTypeTimestampType の場合は、空の文字列で失敗し、例外がスローされます。 Spark 3.0 では、空の文字列は禁止され、StringTypeBinaryType を除くデータ型に対して例外がスローされます。 spark.sql.legacy.json.allowEmptyString.enabledtrue に設定すると、以前の動作を復元して、空の文字列を許可できます。
  • Spark 3.0 では、再帰ディレクトリの一覧表示中にファイルまたはサブディレクトリが消えた場合 (つまり、中間の一覧表示には表示されるが、同時実行ファイルの削除またはオブジェクト ストアの一貫性の問題が原因で、再帰ディレクトリの一覧表示のその後のフェーズでは読み取りまたは一覧表示できない場合) は、spark.sql.files.ignoreMissingFilestrue でない限り、一覧表示が失敗して例外が出力されます (既定は 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.outputTimestampTypeINT96 として設定すると、以前の動作を復元し、相互運用性を維持することができます。
  • 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.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 は異なる値であると見なされます。 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 は、日付/タイムスタンプとのバイナリ比較で StringDate/Timestamp にキャストします。 spark.sql.legacy.typeCoercion.datetimeToString.enabledtrue に設定すると、以前の動作を復元して、Date/TimestampString にキャストできます。
  • 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_timestampdate_formatto_unix_timestampfrom_unixtimeto_dateto_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.timeParserPolicyLEGACY に設定すると、以前の動作を復元できます。
    • weekofyearweekdaydayofweekdate_truncfrom_utc_timestampto_utc_timestampunix_timestamp の各関数は、java.time API を使用して、年の週番号と週の曜日番号を計算し、UTC タイム ゾーンでの TimestampType 値との変換を実行します。
    • JDBC オプション lowerBoundupperBound は、文字列を TimestampType/DateType 値にキャストするのと同じ方法で、TimestampType/DateType 値に変換されます。 変換は、先発グレゴリオ暦と、SQL 構成 spark.sql.session.timeZone によって定義されたタイム ゾーンに基づいて行われます。 Spark バージョン 2.4 以前では、変換は、ハイブリッド カレンダー (ユリウス暦 + グレゴリオ暦) と、既定のシステム タイム ゾーンに基づいて行われます。
    • TIMESTAMPDATE のリテラルを書式設定する。
    • 型指定された TIMESTAMPDATE のリテラルを文字列から作成する。 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 のシステム タイム ゾーンに基づいて行われます。 既定のタイム ゾーンのソースの違いによって、型指定された TIMESTAMPDATE のリテラルの動作が異なることがあります。

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.1 に、spark.sql.hive.metastore.jarsmaven に設定します。
    • カスタム 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.enabledtrue として設定します。 これは、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 で削除されました。 代わりに 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.LinearRegressionelasticNetParam = 0.0 の組み合わせを使用してください。 既定の regParam は、RidgeRegressionWithSGD の場合は 0.01 ですが、LinearRegression の場合は 0.0 であることに注意してください。
  • org.apache.spark.mllib.regression.LassoWithSGD は、2.0 で非推奨になり、3.0 で削除されました。 org.apache.spark.ml.regression.LinearRegressionelasticNetParam = 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.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 を拡張して、トレーニング パラメーターを公開します。 その結果、MultilayerPerceptronClassificationModel 内の layersArray[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 によって置き換えられます。 すべてのカスタム Hive SerDe 実装で、AbstractSerDe への移行が必要です。
    • spark.sql.hive.metastore.jarsbuiltin に設定すると、Databricks Runtime 7.x のメタストアにアクセスするために、Hive 2.3 メタストア クライアントが使用されます。 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’ を使用して年の通日を解析すると、年フィールドがない場合は、間違った結果が返されます。 これは、パターン文字列を使用して datetime 文字列を datetime 値に解析する to_timestamp などの SQL 関数で発生する可能性があります。 (SPARK-31939)
  • サブクエリの内部で結合/ウィンドウ/集計を実行すると、キーの値が-0.0 と0.0 である場合に、間違った結果が返されることがあります。 (SPARK-31958)
  • あいまいな自己結合エラーが原因で、予期しない動作によってウィンドウ クエリが失敗することがあります。 (SPARK-31956)
  • dropDuplicates 演算子を含むストリーミング クエリは、Spark 2.x によって記述されたチェックポイントでは、再開できないことがあります。 (SPARK-31990)