注
この 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 移行ガイドに付属しています。
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.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に設定します。 この環境変数は、すべての実行プログラムとドライバーで一貫している必要があります。 そうしないと、エラーや正しくない応答が発生する可能性があります。 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" 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" です。 オプションを "Legacy" として設定すると、以前の動作が復元されます。 - Spark 3.0 では、指定されたテーブルが Hive SerDe テーブルである場合でも、
SHOW CREATE TABLEは常に Spark DDL を返します。 Hive DDL を生成するには、代わりにSHOW CREATE TABLE AS SERDEコマンドを使用します。 - Spark 3.0 では、Hive-Serde 以外のテーブルでは
CHAR型の列は許可されません。CREATE/ALTER TABLE型が検出されると、CHARコマンドは失敗します。 代わりに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_MICROS列の保存中に、parquet 論理型TIMESTAMPが既定で使用されます。 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にキャストします。Date/TimestampをStringに設定すると、以前の動作を復元して、spark.sql.legacy.typeCoercion.datetimeToString.enabledをtrueにキャストできます。 - 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を使用して実装されます。 新しい実装は、その入力の厳密なチェックを実行します。 たとえば、パターンが2015-07-22 10:00:00である場合は、パーサーが入力全体を使用しないため、yyyy-MM-ddタイムスタンプを解析できません。 もう 1 つの例は、31/01/2015 00:00が 1 から 12 の範囲の時間を事前に想定しているため、dd/MM/yyyy hh:mm入力をhhパターンによって解析できない場合です。 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.timeAPI を使用して、年の週番号と週の曜日番号を計算し、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 では、Hive の動作に応じて、10 進数の文字列表現が異なる場合があります。 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を拡張して、トレーニング パラメーターを公開します。 その結果、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内のメンバー変数 precision は、2.0 で非推奨になり、3.0 で削除されました。 代わりに accuracy を使用してください。 -
org.apache.spark.mllib.evaluation.MulticlassMetrics内のメンバー変数 recall は、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*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' を使用して年の日を解析すると、year フィールドが見つからない場合は間違った結果が返されます。 これは、パターン文字列を使用して datetime 文字列を datetime 値に解析する
to_timestampなどの SQL 関数で発生する可能性があります。 (SPARK-31939) - サブクエリの内部で結合/ウィンドウ/集計を実行すると、キーの値が-0.0 と0.0 である場合に、間違った結果が返されることがあります。 (SPARK-31958)
- あいまいな自己結合エラーが原因で、予期しない動作によってウィンドウ クエリが失敗することがあります。 (SPARK-31956)
-
dropDuplicates演算子を含むストリーミング クエリは、Spark 2.x によって記述されたチェックポイントでは、再開できないことがあります。 (SPARK-31990)