はじめに
SparkのDataFrameで作ったデータをPythonの各モジュールで使いたい時、toPandas()
メソッドを利用してPandasのDataFrameに変換するが、その際にメモリエラーが起きる場合がしばしばある。
メモリに載せられるように試行錯誤した中で、有効そうなものをまとめた。
もっといい手段がありそうなので、ご存じの方は是非教えてください!
やり方
daskを利用して変換する
sparkによる変換は、spark.driver.memory
やspark.driver.maxResultSize
の影響を受けるが、daskの場合はそれがないため、エラーを回避しやすい。
daskを利用した変換
import dask.dataframe as dd
df.write.parquet(parquet_path)
dask_df = dd.read_parquet(parquet_path)
pandas_df = dask_df.compute()
データ型を変更する
バイト数を削減するように、変数のデータ型を変更する。
※勿論、バイト数を削減することで、その後の演算の精度は損なわれる
データ型を変更
# 例えば、int32型(4バイト)をint8型(1バイト)へ変換する
dask_df = dask_dt.astype({k: 'int8' for k in dask_df.dtypes[dask_df.dtypes == 'int32'].index})