在火花上使用python石灰作为udf

Aru*_*unK 9 python pickle apache-spark dill

我想在pyspark的udf中使用石灰 explainer。我以前已经训练过表格解释器,并且按照链接中的建议将其存储为莳萝模型

loaded_explainer = dill.load(open('location_to_explainer','rb'))

def lime_explainer(*cols):
    selected_cols = np.array([value for value in cols])
    exp = loaded_explainer.explain_instance(selected_cols, loaded_model.predict_proba, num_features = 10)
    mapping = exp.as_map()[1]

    return str(mapping)
Run Code Online (Sandbox Code Playgroud)

但是,这会花费很多时间,因为看来很多计算都发生在驱动程序上。然后,我一直在尝试使用Spark广播将解释器广播给执行者。

broadcasted_explainer= sc.broadcast(loaded_explainer)

def lime_explainer(*col):
    selected_cols = np.array([value for value in cols])
    exp = broadcasted_explainer.value.explain_instance(selected_cols, loaded_model.predict_proba, num_features = 10)
    mapping = exp.as_map()[1]

    return str(mapping)        
Run Code Online (Sandbox Code Playgroud)

但是,我在广播中遇到了一个腌制错误。

PicklingError:无法在0x7f69fd5680d0>进行酸洗:在lime.discretize上进行属性查找失败

有人可以帮忙吗?是否有类似的东西dill可以代替spark中使用的cloudpickler?

小智 0

看看这个来源,似乎你别无选择,只能使用提供的pickler。因此,我只能建议您将 dill 嵌套在默认的 pickler 中。不理想,但它可以工作。尝试类似的方法:

broadcasted_explainer = dill.loads(sc.broadcast(dill.dumps(loaded_explainer)).value)
Run Code Online (Sandbox Code Playgroud)

或者您可以尝试调用Dill Extend() 方法,该方法应该将 Dill 数据类型添加到默认的 pickle 包调度中。不知道这是否有效,但你可以尝试一下!