私は、Pythonのクラスとしてスパークでモデルを実装していて、いつでも私はそれが失敗したRDDにクラスメソッドをマッピングしてみてください。私の実際のコードはもっと複雑ですが、この簡易版は、問題の核心に取得します。私は、(例えば)ので、のようなモデルを実行した場合、Pythonクラスを使ってRDDを処理する方法は?
class model(object):
def __init__(self):
self.data = sc.textFile('path/to/data.csv')
# other misc setup
def run_model(self):
self.data = self.data.map(self.transformation_function)
def transformation_function(self,row):
row = row.split(',')
return row[0]+row[1]
今:
test = model()
test.run_model()
test.data.take(10)
私が取得します次のエラー:
例外:それはあなたが放送変数、アクション、またはtransforamtionからSparkContextを参照しようとしていることが表示されます。 SparkContextはドライバでのみ使用でき、ワーカーで実行されるコードでは使用できません。詳細は、SPARK-5063を参照してください。
私はこれで少しプレイしました、そして、確実に私はクラス内RDDにクラスメソッドをマップしようといつでも発生するようです。クラス構造の外部に実装すると、マップされた関数がうまく動作することが確認されています。したがって、この問題は間違いなくクラスと関係しています。これを解決する方法はありますか?
パーフェクト - 私は、静的メソッドを使用して考えていませんでした。私の変換関数は 'model'クラス(RDDではなく)の他の変数にアクセスする必要があります。私はそれを達成するための唯一の方法を、静的メソッドの引数として渡すことを前提としていますか?例えば'def transform_function(row、somevar):return row + somevar' – moustachio
つまり、静的メソッド内からクラス変数(' self.whatever')にアクセスする方法はありますか? – moustachio
(これらは静的変数ではないことに注意してください - 静的メソッド内からインスタンス変数にアクセスすることは間違いありません) – moustachio