私はpysparkパイプラインのコンストラクタをラップしようとしています。 コンストラクタ、および新しくラップされたコンストラクタのサルパッチ。しかし、私はパイプラインのやり方と何か関係があると思われるエラーに遭遇しています。ラップpysparkパイプライン.__ init__とデコレータ
import PythonSparkCombinatorLibrary
from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import HashingTF, Tokenizer
PythonSparkCombinatorLibrary.TransformWrapper.monkeyPatchPipeline()
tokenizer = Tokenizer(inputCol="text", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(),outputCol="features")
lr = LogisticRegression(maxIter=10, regParam=0.001)
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])
私はこのエラーを取得する:
def monkeyPatchPipeline():
oldInit = Pipeline.__init__
def newInit(self, **keywordArgs):
oldInit(self, stages=keywordArgs["stages"])
Pipeline.__init__ = newInit
私は簡単なプログラムを実行すると、しかし:のinitはここ
が実際にモンキーパッチを行うコードがあるデコレータを使用しています
Traceback (most recent call last):
File "C:\<my path>\PythonApplication1\main.py", line 26, in <module>
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])
File "C:<my path>PythonApplication1 \PythonSparkCombinatorLibrary.py", line 36, in newInit
oldInit(self, stages=keywordArgs["stages"])
File "C:\<pyspark_path>\pyspark\__init__.py", line 98, in wrapper
return func(*args, **kwargs)
File "C:\<pyspark_path>\pyspark\ml\pipeline.py", line 63, in __init__
kwargs = self.__init__._input_kwargs
AttributeError: 'function' object has no attribute '_input_kwargs'
pyspark interfaを見ると私はそのパイプラインを見る。 のinitは次のようになります。
@keyword_only
def __init__(self, stages=None):
"""
__init__(self, stages=None)
"""
if stages is None:
stages = []
super(Pipeline, self).__init__()
kwargs = self.__init__._input_kwargs
self.setParams(**kwargs)
そして@keyword_onlyデコレータに注意して、私もそのコードを検査:
def keyword_only(func):
"""
A decorator that forces keyword arguments in the wrapped method
and saves actual input keyword arguments in `_input_kwargs`.
"""
@wraps(func)
def wrapper(*args, **kwargs):
if len(args) > 1:
raise TypeError("Method %s forces keyword arguments." % func.__name__)
wrapper._input_kwargs = kwargs
return func(*args, **kwargs)
return wrapper
私はこのコードは最初の場所でどのように機能するかについての両方全く混乱していますまた、自分のラッパーに問題を引き起こすように見える理由もあります。私はラッパーが_input_kwargsフィールドを自分自身に追加しているのを見ますが、Pipeline .__ init__はそのフィールドをself .__ init __._ input_kwargsでどのように読むのでしょうか?なぜ私はパイプライン.__ init__をもう一度ラップすると同じことは起こりませんか?