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.useOldFetchProtocol
をtrue
に設定します。 そうしないと、 SparkIllegalArgumentException: 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 と同様に、エグゼキューターと driver の両方で環境変数PYSPARK_ROW_FIELD_SORTING_ENABLED
をtrue
に設定します。 この環境変数は、すべてのエグゼキューターとドライバーで一貫している必要があります。 そうしないと、失敗や誤った回答を引き起こす可能性があります。 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.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、データセット、および 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)
は1
T、cast(' 1\t' as boolean)
true
、cast('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.createExternalTable
とSparkSession.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 として扱います。FloatType
とDoubleType
の場合、空の文字列で失敗し、例外がスローされます。Spark 3.0 以降、空の文字列は許可されず、StringType
とBinaryType
を除くデータ型に対して例外がスローされます。 - Spark 3.0 以降、
from_json
関数はPERMISSIVE
とFAILFAST
の 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.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 では、指定されたテーブルが 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.allowUntypedScalaUDF
をtrue
に設定して、使い続けます。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 以下では、
CreateMap
、StringToMap
などの組み込み関数を使用して、重複したキーを使用してマップを作成できます。 重複したキーを持つマップの動作は未定義です、たとえば、マップルックアップは重複したキーが最初に表示されることを尊重する、Dataset.collect
重複したキーが最後に表示されるだけを保持する、MapKeys
重複したキーを返すなどです。 Spark 3.0 では、重複したキーが見つかった場合に Spark はRuntimeException
をスローします。spark.sql.mapKeyDedupPolicy
をLAST_WIN
に設定すると、Last wins ポリシーでマップ キーの重複を排除できます。ユーザーは、重複したキーを持つマップ値を、それを強制しないデータソース (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 では、自己結合によって発生するあいまいな列参照が含まれている場合、データセット クエリは失敗します。 典型的な例:
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.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
は内部構成になり、デフォルトで真になります。 デフォルトで 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 以下では、無効なタイム ゾーン 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_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
タイムスタンプを解析できません。別の例として、31/01/2015 00:00
入力は 1 から 12 の範囲の時間を前提としているためhh``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 metastore のバージョンに応じて、
spark.sql.hive.metastore.version
とspark.sql.hive.metastore.jars
を設定する必要がある場合があります。 たとえば、 Hive metastore バージョンが 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 を参照してください。 - 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.enabled
をtrue
に設定します。 これは、Spark ネイティブ テーブル リーダーとファイル リーダーには影響しません。
- 接続する Hive metastore のバージョンに応じて、
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 Intruns
は 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.0
でorg.apache.spark.ml.regression.LinearRegression
を使用します。デフォルトのregParam
はRidgeRegressionWithSGD
では 0.01 ですが、LinearRegression
では 0.0 であることに注意してください。org.apache.spark.mllib.regression.LassoWithSGD
は 2.0 で非推奨になりましたが、3.0 では削除されました。elasticNetParam = 1.0
でorg.apache.spark.ml.regression.LinearRegression
を使用します。デフォルトの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 では削除されました。代わりに精度を使用してください。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$
Scalapackage 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 コードはコンパイルできません。
Scalastreams
.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
.カスタム HiveSerDe
の実装では、AbstractSerDe
への移行が必要です。 spark.sql.hive.metastore.jars
をbuiltin
に設定すると、Hive 2.3 メタストア クライアントを使用して Databricks Runtime 7.x のメタストアにアクセスすることになります。Hive 1.2 ベースの外部メタストアにアクセスする必要がある場合は、Hive 1.2 jar を含むフォルダーにspark.sql.hive.metastore.jars
を設定します。
- 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
と、ライブラリ処理の変更を説明する非推奨メッセージが表示されます。 ただし、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)