代码之家  ›  专栏  ›  技术社区  ›  Yehuda

在pyspark ml管道中保存自定义转换器[副本]

  •  0
  • Yehuda  · 技术社区  · 7 年前

    当我在Azure数据库中实现这部分python代码时:

    class clustomTransformations(Transformer):
        <code>
    
    custom_transformer = customTransformations()
    ....
    pipeline = Pipeline(stages=[custom_transformer, assembler, scaler, rf])
    pipeline_model = pipeline.fit(sample_data)
    pipeline_model.save(<your path>)
    

    当我试图保存管道时,我得到:

    AttributeError: 'customTransformations' object has no attribute '_to_java'

    0 回复  |  直到 8 年前
        1
  •  5
  •   Shaido MadHadders    7 年前

    似乎没有简单的解决方法,只能尝试并实现java方法,这是StopWordsRemover的建议: Serialize a custom transformer using python to be used within a Pyspark ML pipeline

    def _to_java(self):
        """
        Convert this instance to a dill dump, then to a list of strings with the unicode integer values of each character.
        Use this list as a set of dumby stopwords and store in a StopWordsRemover instance
        :return: Java object equivalent to this instance.
        """
        dmp = dill.dumps(self)
        pylist = [str(ord(d)) for d in dmp] # convert byes to string integer list
        pylist.append(PysparkObjId._getPyObjId()) # add our id so PysparkPipelineWrapper can id us.
        sc = SparkContext._active_spark_context
        java_class = sc._gateway.jvm.java.lang.String
        java_array = sc._gateway.new_array(java_class, len(pylist))
        for i in xrange(len(pylist)):
            java_array[i] = pylist[i]
        _java_obj = JavaParams._new_java_obj(PysparkObjId._getCarrierClass(javaName=True), self.uid)
        _java_obj.setStopWords(java_array)
        return _java_obj
    
    推荐文章