1. メソッドチェーン内で自分自身を参照したい。

メソッドチェーン内で自分自身を参照したいことは多い。

メソッドチェーン内で新規の変数をいくつか作成していて、後続処理でその変数を参照したい。

私はデータ加工処理をできるだけ一つのメソッドチェーンで実装したいので自分自身を参照できる方法はとても大事。

pandas.DataFrameではpipeメソッドを使用して実現できる。

今回はpyspark.sql.DataFrameで自分自身を参照する方法を整理します。

2. pyspark.sql.DataFrame.transform

結論としてはtransformメソッドで自分自身を参照できます。

transformというのが紛らわしいです。

pandas.DataFrame.transformはpysparkのtransformとは全く違う処理です。

pandas.DataFrame.transformの使い方は当ブログでも一度取り上げています。

pandas使用時とpyspark使用時にpipeなのかtransformなのか混乱してしまいそうです。

3. 実例

コードを用いて実例を示します。

3.1. データ準備

今回もsklearnのbostonデータセットを使用します。

import re
import pandas as pd
from sklearn.datasets import load_boston

data = load_boston()
boston_pdf = pd.DataFrame(
    data.data,
    columns=data.feature_names
)
boston_sdf = spark.createDataFrame(
    boston_pdf
)
ouput
In [3]: boston_sdf.printSchema()
root
 |-- CRIM: double (nullable = true)
 |-- ZN: double (nullable = true)
 |-- INDUS: double (nullable = true)
 |-- CHAS: double (nullable = true)
 |-- NOX: double (nullable = true)
 |-- RM: double (nullable = true)
 |-- AGE: double (nullable = true)
 |-- DIS: double (nullable = true)
 |-- RAD: double (nullable = true)
 |-- TAX: double (nullable = true)
 |-- PTRATIO: double (nullable = true)
 |-- B: double (nullable = true)
 |-- LSTAT: double (nullable = true)

3.2. transformを使用して自分自身を参照する

自分自身の列名を参照して列名の最後がSで終了する列を正規表現を使用して選択してみます。

transform内ではlambda式を使用します。

exmaple.py
selected = (
    boston_sdf
    .transform(
        lambda sdf: (
            sdf
            .select(
                [
                    c for c in
                    sdf.columns
                    if re.search(
                        'S$',
                        c,
                    )
                ]
            )
        )
    )
)
selected.printSchema()
ouput
root
 |-- INDUS: double (nullable = true)
 |-- CHAS: double (nullable = true)
 |-- DIS: double (nullable = true)

4. まとめ

pysparkでtransfromを使用することで自分自身を参照できました。

pandasのtransformと紛らわしいのには注意が必要です。