Распаковка и кодирование строки с использованием rdd.map в PySpark - PullRequest
0 голосов
/ 14 сентября 2018

Мне нужно перенести код с PySpark 1.3 на 2.3 (также только на Python 2.7), и у меня есть следующее преобразование карты на rdd:

import cPickle as pickle
import base64

path = "my_filename"

my_rdd = "rdd with data" # pyspark.rdd.PipelinedRDD()

# saving RDD to a file but first encoding everything
my_rdd.map(lambda line: base64.b64encode(pickle.dumps(line))).saveAsTextFile(path)

# another my_rdd.map doing the opposite of the above, fails with the same error
my_rdd = sc.textFile(path).map(lambda line: pickle.loads(base64.b64decode(line)))

Когда эта часть запускается, я получаю следующую ошибку:

   raise pickle.PicklingError(msg)
PicklingError: Could not serialize object: Exception: It appears that you are attempting to broadcast an RDD or reference an RDD from an action or transformation. RDD transformations and actions can only be invoked by the driver, not inside of other transformations; for example, rdd1.map(lambda x: rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. For more information, see SPARK-5063.

Похоже, что подобные действия больше не разрешены в функции map. Любое предложение, как потенциально переписать эту часть?

UPDATE:

достаточно странно, просто делаю:

my_rdd.saveAsTextFile(path)

также завершается с той же ошибкой.

1 Ответ

0 голосов
/ 20 ноября 2018

В итоге, проблема была где-то глубоко в функциях, выполняющих преобразования. В этом случае проще переписать, чем отладить.

...