PySpark のアップグレード#
PySpark 3.5 から 4.0 へのアップグレード#
Spark 4.0 では、PySpark で Python 3.8 のサポートが廃止されました。
Spark 4.0 では、PySpark でサポートされる Pandas の最小バージョンが 1.0.5 から 2.0.0 に引き上げられました。
Spark 4.0 では、PySpark でサポートされる Numpy の最小バージョンが 1.15 から 1.21 に引き上げられました。
Spark 4.0 では、PySpark でサポートされる PyArrow の最小バージョンが 4.0.0 から 11.0.0 に引き上げられました。
Spark 4.0 では、Spark 上の pandas API から
Int64IndexおよびFloat64Indexが削除され、直接Indexを使用する必要があります。Spark 4.0 では、Spark 上の pandas API から
DataFrame.iteritemsが削除され、代わりにDataFrame.itemsを使用してください。Spark 4.0 では、Spark 上の pandas API から
Series.iteritemsが削除され、代わりにSeries.itemsを使用してください。Spark 4.0 では、Spark 上の pandas API から
DataFrame.appendが削除され、代わりにps.concatを使用してください。Spark 4.0 では、Spark 上の pandas API から
Series.appendが削除され、代わりにps.concatを使用してください。Spark 4.0 では、Spark 上の pandas API から
DataFrame.madが削除されました。Spark 4.0 では、Spark 上の pandas API から
Series.madが削除されました。Spark 4.0 では、Spark 上の pandas API から
Index.factorizeおよびSeries.factorizeのna_sentinelパラメータが削除され、代わりにuse_na_sentinelを使用してください。Spark 4.0 では、Spark 上の pandas API から
Categorical.add_categories,Categorical.remove_categories,Categorical.set_categories,Categorical.rename_categories,Categorical.reorder_categories,Categorical.as_ordered,Categorical.as_unorderedのinplaceパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
CategoricalIndex.add_categories,CategoricalIndex.remove_categories,CategoricalIndex.remove_unused_categories,CategoricalIndex.set_categories,CategoricalIndex.rename_categories,CategoricalIndex.reorder_categories,CategoricalIndex.as_ordered,CategoricalIndex.as_unorderedのinplaceパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
ps.date_rangeのclosedパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
DataFrame.between_timeのinclude_startおよびinclude_endパラメータが削除され、代わりにinclusiveを使用してください。Spark 4.0 では、Spark 上の pandas API から
Series.between_timeのinclude_startおよびinclude_endパラメータが削除され、代わりにinclusiveを使用してください。Spark 4.0 では、Spark 上の pandas API から
DatetimeIndexの各種日時属性(day,month,yearなど)がint64ではなくint32になりました。Spark 4.0 では、Spark 上の pandas API から
DataFrame.plotおよびSeries.plotのsort_columnsパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
Series.str.replaceのregexパラメータのデフォルト値がTrueからFalseに変更されました。さらに、regex=Trueを指定した単一文字のpatは、文字列リテラルではなく正規表現として扱われるようになりました。Spark 4.0 では、Spark 上の pandas API から、
value_countsの結果の名前はすべて'count'(normalize=Trueが渡された場合は'proportion')に設定され、インデックスは元のオブジェクトの名前になります。Spark 4.0 では、Spark 上の pandas API から
ps.read_csvおよびps.read_excelのsqueezeパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
DataFrame.infoのnull_countsパラメータが削除され、代わりにshow_countsを使用してください。Spark 4.0 では、Spark 上の pandas API から、
MultiIndex.appendの結果はインデックス名を保持しなくなりました。Spark 4.0 では、Spark 上の pandas API から、
as_index=Falseを尊重したリストでのDataFrameGroupBy.aggがサポートされます。Spark 4.0 では、Spark 上の pandas API から、
DataFrame.stackは既存の列を辞書順にソートするのではなく、その順序を保証するようになりました。Spark 4.0 では、Spark 上の pandas API から、
Series.betweenのinclusiveパラメータへのTrueまたはFalseの指定が削除され、それぞれbothまたはneitherを使用してください。Spark 4.0 では、Spark 上の pandas API から
Index.asi8が削除され、代わりにIndex.astypeを使用してください。Spark 4.0 では、Spark 上の pandas API から
Index.is_type_compatibleが削除され、代わりにIndex.isinを使用してください。Spark 4.0 では、Spark 上の pandas API から
DataFrame.to_latexおよびSeries.to_latexのcol_spaceパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
DataFrame.to_spark_ioが削除され、代わりにDataFrame.spark.to_spark_ioを使用してください。Spark 4.0 では、Spark 上の pandas API から
Series.is_monotonicおよびIndex.is_monotonicが削除され、それぞれSeries.is_monotonic_increasingまたはIndex.is_monotonic_increasingを使用してください。Spark 4.0 では、Spark 上の pandas API から
DataFrame.get_dtype_countsが削除され、代わりにDataFrame.dtypes.value_counts()を使用してください。Spark 4.0 では、Spark 上の pandas API から
DataFrame.to_excelおよびSeries.to_excelのencodingパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
DataFrame.to_excelおよびSeries.to_excelのverboseパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
read_csvのmangle_dupe_colsパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
DataFrameGroupBy.backfillが削除され、代わりにDataFrameGroupBy.bfillを使用してください。Spark 4.0 では、Spark 上の pandas API から
DataFrameGroupBy.padが削除され、代わりにDataFrameGroupBy.ffillを使用してください。Spark 4.0 では、Spark 上の pandas API から
Index.is_all_datesが削除されました。Spark 4.0 では、Spark 上の pandas API から
read_excelのconvert_floatパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
read_excelのmangle_dupe_colsパラメータが削除されました。Spark 4.0 では、Spark 上の pandas API から
DataFrame.koalasが削除され、代わりにDataFrame.pandas_on_sparkを使用してください。Spark 4.0 では、PySpark から
DataFrame.to_koalasが削除され、代わりにDataFrame.pandas_apiを使用してください。Spark 4.0 では、PySpark から
DataFrame.to_pandas_on_sparkが削除され、代わりにDataFrame.pandas_apiを使用してください。Spark 4.0 では、Pandas on Spark API から
DatatimeIndex.weekおよびDatatimeIndex.weekofyearが削除され、代わりにDatetimeIndex.isocalendar().weekを使用してください。Spark 4.0 では、Pandas on Spark API から
Series.dt.weekおよびSeries.dt.weekofyearが削除され、代わりにSeries.dt.isocalendar().weekを使用してください。Spark 4.0 では、Decimal 型オブジェクトに
astypeを適用した場合、既存の欠損値は Pandas on Spark API ではFalseではなくTrueに変更されます。Spark 4.0 では、Pandas on Spark API から
pyspark.testing.assertPandasOnSparkEqualが削除され、代わりにpyspark.pandas.testing.assert_frame_equalを使用してください。Spark 4.0 では、Pandas on Spark API からエイリアス
Y,M,H,T,Sが非推奨となり、それぞれYE,ME,h,min,sを使用してください。Spark 4.0 では、マップ列のスキーマは、マップ内のすべてのペアのスキーマをマージすることによって推論されます。スキーマが最初の非ヌルペアからのみ推論される以前の動作を復元するには、
spark.sql.pyspark.legacy.inferMapTypeFromFirstPair.enabledをtrueに設定できます。Spark 4.0 では、
compute.ops_on_diff_framesがデフォルトで有効になっています。以前の動作を復元するには、compute.ops_on_diff_framesをfalseに設定してください。Spark 4.0 では、
DataFrame.collectのデータ型YearMonthIntervalTypeは、基になる整数を返さなくなりました。以前の動作を復元するには、環境変数PYSPARK_YM_INTERVAL_LEGACYを1に設定してください。Spark 4.0 では、
from pyspark.sql.functions import *のワイルドカードインポートから、関数以外の項目(DataFrame,Column,StructTypeなど)が削除されました。これらの項目は適切なモジュールからインポートする必要があります(例:from pyspark.sql import DataFrame, Column,from pyspark.sql.types import StructType)。Spark 4.0 では、pandas API on Spark は、ANSI モードが有効になっている(デフォルトで有効)Spark が基盤にある場合、例外を発生させます。これは ANSI モードでは正常に機能しないためです。機能させるには、
spark.sql.ansi.enabledをfalseに設定して明示的に ANSI モードを無効にする必要があります。または、pandas-on-spark オプションcompute.fail_on_ansi_modeをFalseに設定して強制的に機能させることもできますが、予期しない動作を引き起こす可能性があります。
PySpark 3.3 から 3.4 へのアップグレード#
Spark 3.4 では、配列列のスキーマは、配列内のすべての要素のスキーマをマージすることによって推論されます。スキーマが最初の要素からのみ推論される以前の動作を復元するには、
spark.sql.pyspark.legacy.inferArrayTypeFromFirstElement.enabledをtrueに設定できます。Spark 3.4 では、Pandas on Spark API の
Groupby.applyのfuncパラメータの戻り値の型が指定されておらず、compute.shortcut_limitが 0 に設定されている場合、スキーマ推論が正確になるように、サンプリング行は 2(サンプリング行が常に 2 以上であることを保証)に設定されます。Spark 3.4 では、Pandas on Spark API の
Index.insertが範囲外の場合、index {} is out of bounds for axis 0 with size {}という IndexError を発生させ、pandas 1.4 の動作に従います。Spark 3.4 では、pandas 1.4 の動作に従うために、Pandas on Spark API の
Series.modeでシリーズ名が保持されるようになります。Spark 3.4 では、Pandas on Spark API の
Index.__setitem__は、valueの型がColumn型であるかを最初にチェックし、is_list_likeでCannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.のような予期しないValueErrorの発生を回避します。Spark 3.4 では、Pandas on Spark API の
astype('category')は、元のデータのdtypeに従ってcategories.dtypeも更新し、pandas 1.4 の動作に従います。Spark 3.4 では、Pandas on Spark API は pandas 1.4 に従い、
GroupBy.headおよびGroupBy.tailで groupby 位置インデックスをサポートします。負の引数が正しく機能し、各グループの末尾および先頭からの範囲を返します。以前は、負の引数は空のフレームを返していました。Spark 3.4 では、Pandas on Spark の
groupby.applyのスキーマ推論プロセスは、まず pandas の型を推論し、pandas のdtypeの精度を可能な限り保証します。Spark 3.4 では、pandas 1.4 の動作に従い、
Series.concatの sort パラメータが尊重されます。Spark 3.4 では、pandas 1.4 の動作に従い、
DataFrame.__setitem__はコピーを作成し、既存の配列を上書きせずに置き換えます。Spark 3.4 では、
SparkSession.sqlおよび Pandas on Spark API のsqlに、名前付きパラメータを SQL リテラルにバインドする新しいパラメータargsが追加されました。Spark 3.4 では、Pandas API on Spark は pandas 2.0 に準拠しており、Spark 3.4 では pandas 2.0 の変更に従って一部の API が非推奨または削除されました。詳細については、[pandas のリリースノート](https://pandas.dokyumento.jp/docs/dev/whatsnew/) を参照してください。
Spark 3.4 では、
collections.namedtupleのカスタムモンキーパッチが削除され、デフォルトでcloudpickleが使用されるようになりました。collections.namedtupleの関連するピッキング問題の以前の動作を復元するには、環境変数PYSPARK_ENABLE_NAMEDTUPLE_PATCHを1に設定してください。
PySpark 3.2 から 3.3 へのアップグレード#
Spark 3.3 では、
pyspark.pandas.sqlメソッドは [標準の Python 文字列フォーマッタ](https://docs.python.org/3/library/string.html#format-string-syntax) に従います。以前の動作を復元するには、環境変数PYSPARK_PANDAS_SQL_LEGACYを1に設定してください。Spark 3.3 では、Spark 上の pandas API の
dropメソッドがindexによる行の削除をサポートし、デフォルトで列ではなくインデックスによる削除を設定します。Spark 3.3 では、PySpark は Pandas のバージョンをアップグレードしました。新しい最小必須バージョンは 0.23.2 から 1.0.5 に変更されました。
Spark 3.3 では、SQL データ型の
reprの戻り値が変更され、evalに渡されたときに同じ値を持つオブジェクトを生成するようになりました。
PySpark 3.1 から 3.2 へのアップグレード#
Spark 3.2 では、sql, ml, spark_on_pandas モジュールの PySpark メソッドは、不適切な型のパラメータに適用された場合、
ValueErrorの代わりにTypeErrorを発生させます。Spark 3.2 では、Python UDF、pandas UDF、および pandas 関数 API からのトレースバックは、デフォルトで内部 Python ワーカーからのトレースバックなしで簡略化されます。Spark 3.1 以前では、Python ワーカーからのトレースバックが出力されていました。Spark 3.2 より前の動作を復元するには、
spark.sql.execution.pyspark.udf.simplifiedTraceback.enabledをfalseに設定できます。Spark 3.2 では、デフォルトでピン留めスレッドモードが有効になり、各 Python スレッドが対応する JVM スレッドにマッピングされます。以前は、1 つの JVM スレッドが複数の Python スレッドで再利用される可能性があり、1 つの JVM スレッドローカルが複数の Python スレッドに共有される結果となっていました。また、JVM スレッド内のローカルプロパティなどの継承可能な属性を正しく継承し、潜在的なリソースリークの問題を回避するために、Python スレッドで
pyspark.InheritableThreadまたはpyspark.inheritable_thread_targetを一緒に使用することが推奨されることに注意してください。Spark 3.2 より前の動作を復元するには、環境変数PYSPARK_PIN_THREADをfalseに設定できます。
PySpark 2.4 から 3.0 へのアップグレード#
Spark 3.0 では、PySpark は pandas 関連の機能(
toPandas、pandas DataFrame からのcreateDataFrameなど)を使用するために pandas バージョン 0.23.2 以上を必要とします。Spark 3.0 では、PySpark は PyArrow 関連の機能(
pandas_udf、toPandas、および "spark.sql.execution.arrow.enabled=true" を使用したcreateDataFrameなど)を使用するために PyArrow バージョン 0.12.1 以上を必要とします。PySpark では、
SparkSession.builder.getOrCreate()でSparkSessionを作成する際に、既存のSparkContextが存在する場合、ビルダーはビルダーに指定された構成で既存のSparkContextのSparkConfを更新しようとしました。しかし、SparkContextはすべてのSparkSessionで共有されるため、更新すべきではありません。3.0 では、ビルダーは構成を更新しなくなりました。これは 2.3 以降の Java/Scala API と同じ動作です。構成を更新したい場合は、SparkSessionを作成する前に更新する必要があります。PySpark では、Arrow 最適化が有効になっている場合、Arrow バージョンが 0.11.0 より大きい場合、シリアライズ中に pandas.Series を Arrow 配列に変換する際に Arrow は安全な型変換を実行できます。Arrow は、オーバーフローのような安全でない型変換を検出するとエラーを発生させます。
spark.sql.execution.pandas.convertToArrowArraySafelyを true に設定することで有効にできます。デフォルト設定は false です。Arrow バージョンに対する PySpark の動作を次の表に示します。PyArrow バージョン
整数オーバーフロー
浮動小数点数切り捨て
0.11.0 以下
エラーを発生させる
サイレントに許可する
> 0.11.0, arrowSafeTypeConversion=false
サイレントオーバーフロー
サイレントに許可する
> 0.11.0, arrowSafeTypeConversion=true
エラーを発生させる
エラーを発生させる
Spark 3.0 では、PySpark で
createDataFrame(..., verifySchema=True)も LongType を検証します。以前は、LongType は検証されず、値がオーバーフローした場合に None が返されていました。この動作を復元するには、verifySchema を False に設定して検証を無効にできます。Spark 3.0 以降、Python 3.6 以降のバージョンでは、
Rowのフィールド名は名前付き引数で構成する際にアルファベット順にソートされなくなり、フィールドの順序は入力された順序と一致します。Spark 2.4 のようにデフォルトでフィールドをソートするには、executor および driver の両方で環境変数PYSPARK_ROW_FIELD_SORTING_ENABLEDを true に設定してください。この環境変数はすべての executor および driver で一貫している必要があります。そうしないと、失敗または誤った結果を招く可能性があります。Python バージョン 3.6 未満では、フィールド名はアルファベット順にソートされるのが唯一のオプションです。Spark 3.0 では、
pyspark.ml.param.shared.Has*ミキシンはset*(self, value)セッターメソッドを提供しなくなりました。代わりに、それぞれのself.set(self.*, value)を使用してください。詳細は [SPARK-29093](SPARK-29093) を参照してください。
PySpark 2.3 から 2.4 へのアップグレード#
PySpark では、Arrow 最適化が有効になっている場合、以前は
toPandasは Arrow 最適化が使用できない場合に単に失敗していましたが、pandas DataFrame からのcreateDataFrameは非最適化へのフォールバックを許可していました。現在では、toPandasおよび pandas DataFrame からのcreateDataFrameの両方で、デフォルトでフォールバックが許可されており、spark.sql.execution.arrow.fallback.enabledで無効にできます。
PySpark 2.3.0 から 2.3.1 以降へのアップグレード#
バージョン 2.3.1 以降、
pandas_udfおよびtoPandas()/createDataFrame()(spark.sql.execution.arrow.enabledがTrueに設定されている場合)を含む Arrow 機能は実験的なものとしてマークされています。これらはまだ進化中であり、現在、本番環境での使用は推奨されていません。
PySpark 2.2 から 2.3 へのアップグレード#
PySpark では、
toPandas、pandas DataFrame からのcreateDataFrameなどの pandas 関連機能を使用するには、Pandas 0.19.2 以上が必要になりました。PySpark では、pandas 関連機能のタイムスタンプ値の動作が、セッションタイムゾーンを尊重するように変更されました。古い動作を使用したい場合は、設定
spark.sql.execution.pandas.respectSessionTimeZoneを False に設定する必要があります。[SPARK-22395](SPARK-22395) を参照してください。PySpark では、
na.fill()またはfillnaもブール値を受け入れ、null をブール値で置き換えます。以前の Spark バージョンでは、PySpark はそれを無視して元の Dataset/DataFrame を返していました。PySpark では、
df.replaceはto_replaceが辞書でない場合に値を省略することを許可しませんでした。以前は、他のケースで値を省略でき、デフォルトで None になっていましたが、これは直感的ではなくエラーが発生しやすかったです。
PySpark 1.4 から 1.5 へのアップグレード#
Python での文字列から列への解決は、ドット(.)を使用して列を修飾したり、ネストされた値にアクセスしたりできるようになりました。例:
df['table.column.nestedField']。ただし、これは列名にドットが含まれている場合は、バッククォート(例:table.`column.with.dots`.nested)を使用してエスケープする必要があることを意味します。PySpark の DataFrame.withColumn メソッドは、新しい列を追加したり、同じ名前の既存の列を置き換えたりすることをサポートします。
PySpark 1.0-1.2 から 1.3 へのアップグレード#
Python で DataTypes を使用する場合、シングルトンを参照するのではなく、それらを構築(例:
StringType())する必要があります。