メインコンテンツまでスキップ

Databricks Runtime 7.x 移行ガイド (EoS)

注記

この Databricks Runtime バージョンのサポートは終了しました。 サポート終了日については、「 サポート終了の履歴」を参照してください。 サポートされているすべての Databricks Runtime バージョンについては、「 Databricks Runtime リリースノートのバージョンと互換性」を参照してください。

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

このガイドでは、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 の動作の大幅な変更

Spark 2.4 から Spark 3.0 への次の動作変更により、Databricks Runtime 6.x から Databricks Runtime 7.x に移行するときに 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.useOldFetchProtocoltrueに設定します。 そうしないと、 Spark IllegalArgumentException: Unexpected message type: <number> のようなメッセージでエラーが発生する可能性があります。

PySparkの

  • Spark 3.0 では、 Column.getItemColumn.applyを呼び出さないように固定されています。 したがって、 Column を の引数として使用する場合は、インデックス演算子 getItemを使用する必要があります。 たとえば、 map_col.getItem(col('id'))map_col[col('id')]に置き換える必要があります。
  • Spark 3.0 以降、Python バージョン 3.6 以降の名前付き引数を使用して構築するときに、 Row フィールド名がアルファベット順に並べ替えられなくなり、フィールドの順序は入力されたとおりに一致します。 デフォルトによるソートフィールドを有効にするには、 Spark 2.4 と同様に、エグゼキューターと driver の両方で環境変数 PYSPARK_ROW_FIELD_SORTING_ENABLEDtrue に設定します。 この環境変数は、すべてのエグゼキューターとドライバーで一貫している必要があります。 そうしないと、失敗や誤った回答を引き起こす可能性があります。 Python のバージョンが 3.6 より前の場合、フィールド名は唯一のオプションとしてアルファベット順にソートされます。
  • Python 2 のサポートを廃止しました (SPARK-27884)。

構造化ストリーミング

  • Spark 3.0 では、text、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.ContinuousTriggerTrigger.Continuousを支持して削除され、 org.apache.spark.sql.execution.streaming.OneTimeTriggerTrigger.Onceを支持して隠されています。 SPARK-28199 を参照してください。

SQL、データセット、および DataFrame

  • 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)、および Boolean 型にキャストする場合、先頭と末尾の空白 (<= ACSII 32) は、これらの型値に変換される前にトリミングされます (たとえば、cast(' 1\t' as int)1T、cast(' 1\t' as boolean) truecast('2019-10-10\t as date) は日付値 2019-10-10を返します)。Sparkバージョン2.4以前では、文字列を積分とブールにキャストするときに、両端から空白をトリミングせず、前述の結果はnullされますが、datetimesには、末尾のスペース(= 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.createExternalTableSparkSession.createExternalTable が削除され、 createTable置き換えられた .
  • Spark 3.0 では、構成 spark.sql.crossJoin.enabled 内部構成になり、デフォルトで真になるため、デフォルトで、暗黙的なクロス結合を持つ SQL で例外は発生しません。
  • Spark 3.0 では、他のデータベースと互換性を持つように、trim 関数の引数の順序を TRIM(trimStr, str) から TRIM(str, trimStr) に逆にしました。
  • Spark バージョン 2.4 以前では、 FROM <table>FROM <table> UNION ALL FROM <table> などの SQL クエリが誤ってサポートされます。 ハイブ スタイルの FROM <table> SELECT <expr>では、 SELECT 句は無視できません。 Hive と Presto のどちらもこの構文をサポートしていません。 したがって、Spark 3.0 以降、これらのクエリは無効として扱われます。
  • Spark 3.0 以降、データセットとDataFrame API unionAllは非推奨ではなくなりました。これは unionのエイリアスです。
  • Spark バージョン 2.4 以前では、JSON データソースのパーサーは、 IntegerTypeなどの一部のデータ型で空の文字列を null として扱います。 FloatTypeDoubleTypeの場合、空の文字列で失敗し、例外がスローされます。Spark 3.0 以降、空の文字列は許可されず、 StringTypeBinaryTypeを除くデータ型に対して例外がスローされます。
  • Spark 3.0 以降、 from_json 関数は PERMISSIVEFAILFASTの 2 つのモードをサポートしています。 モードは 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" です。 オプションを「レガシー」に設定すると、以前の動作が復元されます。
  • Spark 3.0 では、指定されたテーブルが Hive SerDe テーブルであっても、 SHOW CREATE TABLE は常に Spark DDL を返します。 Hive DDL を生成するには、代わりに SHOW CREATE TABLE AS SERDE コマンドを使用します。
  • Spark 3.0 では、CHAR 型の列は Hive-Serde 以外のテーブルでは許可されず、CHAR型が検出されると CREATE/ALTER TABLE コマンドは失敗します。代わりに STRING タイプを使用してください。 Spark バージョン 2.4 以前では、 CHAR 型は STRING 型として扱われ、length パラメーターは単に無視されます。

UDFs と組み込み関数

  • 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 クロージャを取得した場合、入力値が null の場合、返される UDF は null を返します。 ただし、Spark 3.0 では、入力値が null の場合、UDF は 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 に設定すると、Last wins ポリシーでマップ キーの重複を排除できます。ユーザーは、重複したキーを持つマップ値を、それを強制しないデータソース (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.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 では、自己結合によって発生するあいまいな列参照が含まれている場合、データセット クエリは失敗します。 典型的な例: val df1 = ...; val df2 = df1.filter(...);, then df1.join(df2, df1("a") > df2("a")) は空の結果を返し、これは非常に混乱を招きます。 これは、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 は内部構成になり、デフォルトで真になります。 デフォルトで 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 にキャストします。 Date/TimestampString にキャストする以前の動作は、 spark.sql.legacy.typeCoercion.datetimeToString.enabledtrueに設定することで復元できます。
  • Spark バージョン 2.4 以下では、無効なタイム ゾーン ID はサイレントに無視され、 from_utc_timestamp 関数などで GMT タイム ゾーンに置き換えられます。 Spark 3.0 では、このようなタイム ゾーン ID は拒否され、Spark は java.time.DateTimeException.
  • Spark 3.0 では、Proleptic グレゴリオ暦は、日付とタイムスタンプの解析、書式設定、変換、および年、日などのサブコンポーネントの抽出に使用されます。 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タイムスタンプを解析できません。別の例として、31/01/2015 00:00 入力は 1 から 12 の範囲の時間を前提としているためhh``dd/MM/yyyy hh:mm パターンでは解析できません。Spark バージョン 2.4 以下では、タイムスタンプ/日付文字列の変換に java.text.SimpleDateFormat が使用され、サポートされているパターンは simpleDateFormat で説明されています。 以前の動作は、 spark.sql.legacy.timeParserPolicyLEGACYに設定することで復元できます。
    • weekofyearweekdaydayofweekdate_truncfrom_utc_timestampto_utc_timestamp、およびunix_timestamp関数はjava.time API を使用して、年、週の日を計算し、UTC タイム ゾーンでの TimestampType 値との間の変換を行います。
    • JDBC オプション lowerBoundupperBound は、文字列を TimestampType/DateType 値にキャストするのと同じ方法で TimestampType/DateType 値に変換されます。 変換は、先頭のグレゴリオ暦と、SQL 構成 spark.sql.session.timeZoneで定義されたタイム ゾーンに基づいています。 Spark バージョン 2.4 以下では、変換はハイブリッド カレンダー (ユリウス暦 + グレゴリオ暦) とデフォルトのシステム タイム ゾーンに基づいています。
    • 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 metastore のバージョンに応じて、spark.sql.hive.metastore.versionspark.sql.hive.metastore.jarsを設定する必要がある場合があります。 たとえば、 Hive metastore バージョンが 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 を参照してください。
    • Hive 1.2 と Hive 2.3 では、スクリプト変換に SQL で TRANSFORM 演算子を使用する場合、Hive 1.2 と Hive 2.3 で 10 進文字列の表現が異なる場合があります。これは Hive の動作によって異なります。 Hive 1.2 では、文字列表現では末尾のゼロが省略されます。 ただし、Hive 2.3 では、必要に応じて常に 18 桁に末尾に 0 が埋め込まれます。
    • Databricks Runtime 7.x では、Hive SerDe テーブルを読み取るときに、by デフォルト 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 2.1 で非推奨となった param Int runsは 3.0 で削除されました。 代わりに、実行なしの 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 では削除されました。 elasticNetParam = 0.0org.apache.spark.ml.regression.LinearRegression を使用します。デフォルトの regParamRidgeRegressionWithSGDでは 0.01 ですが、 LinearRegressionでは 0.0 であることに注意してください。
  • org.apache.spark.mllib.regression.LassoWithSGDは 2.0 で非推奨になりましたが、3.0 では削除されました。 elasticNetParam = 1.0org.apache.spark.ml.regression.LinearRegression を使用します。デフォルトの regParamLassoWithSGDでは 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.MultilayerPerceptronClassificationModelMultilayerPerceptronParams を拡張してトレーニング パラメーターを公開します。 これにより、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 では削除されました。代わりに精度を使用してください。
  • 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によって公開された追加のメソッドは、いずれにせよこの場合は機能しません。(スパーク-31681)
  • Spark 3.0 では、 pyspark.ml.param.shared.Has* mixin は set*(self, value) セッターメソッドを提供しなくなり、代わりにそれぞれの self.set(self.*, value) を使用します。 詳細については、SPARK-29093 を参照してください。 (スパーク-29093)

その他の動作変更

  • Scala 2.12 へのアップグレードには、以下の変更が含まれます。

    • パッケージ・セルのシリアライゼーションは、異なる方法で処理されます。 次の例は、動作の変更とその処理方法を示しています。

      次のパッケージ セルで定義されているように foo.bar.MyObjectInPackageCell.run() を実行すると、エラーがトリガーされます java.lang.NoClassDefFoundError: Could not initialize class foo.bar.MyObjectInPackageCell$

      Scala
      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 コードはコンパイルできません。

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

      コンパイルエラーを修正するには、 foreachBatch { (df, id) => myFunc(df, id) }foreachBatch(myFunc _) に変更するか、Java APIを明示的に使用します foreachBatch(new VoidFunction2 ...)

  • AWS SDK を 1.11.655 にアップグレードすると、 org.apache.hadoop.fs.s3native.NativeS3FileSystem を使用するには AWS Signature v4 とバケットエンドポイントのセットアップが必要になります。 ユーザーが S3N ファイルシステムを使用して S3 へのリクエストに署名するように AWS Signature v2 を設定している場合、またはユーザーが「+」文字を含む S3 パスにアクセスし、レガシー S3N ファイルシステム ( s3n://bucket/path/+file など) を使用している場合、403 Forbidden エラーがスローされることがあります。

  • Hive ユーザー定義関数と Hive SerDes の処理に使用される Apache Hive のバージョンが 2.3 にアップグレードされるため、次の 2 つの変更が必要です。

    • Hive の SerDe インターフェイスは、抽象クラス AbstractSerDe.カスタム Hive SerDe の実装では、 AbstractSerDe への移行が必要です。
    • spark.sql.hive.metastore.jarsbuiltin に設定すると、Hive 2.3 メタストア クライアントを使用して Databricks Runtime 7.x のメタストアにアクセスすることになります。Hive 1.2 ベースの外部メタストアにアクセスする必要がある場合は、Hive 1.2 jar を含むフォルダーに spark.sql.hive.metastore.jars を設定します。

廃止と削除

  • データ スキップ インデックスは 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 と、ライブラリ処理の変更を説明する非推奨メッセージが表示されます。 ただし、Databricks Runtime Databricksプラットフォーム バージョン 3.20 がワークスペースにリリースされる前に 以前のバージョンの で作成されたクラスターがあり そのクラスターを編集してDatabricks Runtime 7.x を使用すると、すべてのクラスターにインストールされるように構成されたライブラリは、そのクラスターにインストールされます。この場合、インストールされているライブラリに互換性のない JAR があると、クラスターが無効になる可能性があります。 回避策は、クラスターを複製するか、新しいクラスターを作成することです。

  • org.apache.hadoop.fs.s3native.NativeS3FileSystem また、 org.apache.hadoop.fs.s3.S3FileSystem は S3 へのアクセスをサポートしなくなりました。

    Databricks Runtimeの s3a://s3://、および s3n:// ファイルシステムスキームのデフォルトである com.databricks.s3a.S3AFileSystem を使用することを強くお勧めします。com.databricks.s3a.S3AFileSystemへの移行についてサポートが必要な場合は、Databricks サポートまたは Databricks アカウント チームにお問い合わせください。

既知の問題

  • パターン文字 'D' を使用して年の日を解析すると、年フィールドが欠落している場合、間違った結果が返されます。 これは、パターン文字列を使用して日付時刻文字列を日付時刻値に解析する to_timestamp などの SQL 関数で発生する可能性があります。 (スパーク-31939)
  • サブクエリ内の結合/ウィンドウ/集約は、キーの値が -0.0 と 0.0 の場合、間違った結果につながる可能性があります。 (スパーク-31958)
  • ウィンドウ クエリがあいまいな自己結合エラーで予期せず失敗することがあります。 (スパーク-31956)
  • dropDuplicates演算子を使用したストリーミング クエリは、Spark 2.x によって書き込まれたチェックポイントで再開できない場合があります。(スパーク-31990)