Я dill
автор.Я согласен с @Majaha и немного расширю ответ @ Majaha.В первой ссылке в ответе @ Majaha четко указано, что экземпляр Broadcast
жестко связан с использованием pickle
... так что предложение dill
в строку, затем un dill
впоследствии является хорошим.
К сожалению, метод extend
, вероятно, не будет работать для вас.В классе Broadcast
источник использует CPickle
, который dill
не может расширяться.Если вы посмотрите на источник, он использует import CPickle as pickle; ... pickle.dumps
для Python 2 и import pickle; ... pickle.dumps
для Python 3. Если бы он использовал import pickle; ... pickle.dumps
для Python 2 и import pickle; ... pickle._dumps
для Python 3, то dill
мог бы расширить средство выборапросто делая import dill
.Например:
Python 3.6.6 (default, Jun 28 2018, 05:53:46)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from pickle import _dumps
>>> import dill
>>> _dumps(lambda x:x)
b'\x80\x03cdill._dill\n_create_function\nq\x00(cdill._dill\n_load_type\nq\x01X\x08\x00\x00\x00CodeTypeq\x02\x85q\x03Rq\x04(K\x01K\x00K\x01K\x01KCC\x04|\x00S\x00q\x05N\x85q\x06)X\x01\x00\x00\x00xq\x07\x85q\x08X\x07\x00\x00\x00<stdin>q\tX\x08\x00\x00\x00<lambda>q\nK\x01C\x00q\x0b))tq\x0cRq\rc__main__\n__dict__\nh\nNN}q\x0etq\x0fRq\x10.'
Таким образом, вы можете либо сделать то, что предлагает @Majaha (и перенаправить вызов на broadcast
), либо вы можете пропатчить код, чтобы сделать замену, которую я описал выше (где это необходимо), но да ...), или вы можете создать свой собственный производный класс, который выполняет эту работу, используя dill
:
>>> from pyspark.broadcast import Broadcast as _Broadcast
>>>
>>> class Broadcast(_Broadcast):
... def dump(self, value, f):
... try:
... import dill
... dill.dump(value, f, pickle_protocol)
... ...[INSERT THE REST OF THE DUMP METHOD HERE]...
Если вышеописанное не удается ... вы все равно можете получить егоопределите, где происходит сбой сериализации (dill.detect.trace
поможет вам в этом).
Если вы собираетесь pyspark
использовать dill
... потенциально лучшее предложение - эторазрешить пользователям динамически заменять сериализатор.Это то, что mpi4py
и несколько других пакетов делают.