Spark RDD записать в глобальный список
Как записать в глобальный список с rdd?
Li = []
Fn(list):
If list.value == 4:
Li.append(1)
rdd.mapValues(lambda x:fn(x))
Когда я пытаюсь напечатать Ли, результат: []
То, что я пытаюсь сделать, - это преобразовать еще один глобальный список Li1 при преобразовании объекта rdd. Однако, когда я делаю это, у меня всегда есть пустой список в конце. Li1 никогда не трансформируется.
1 ответ
Причина, по которой вы получаете Li
значение установлено в []
после выполнения mapValue
s - это потому что Spark сериализует Fn
Функция (и все глобальные переменные, на которые она ссылается - называется закрытием) и отправляет на другую машину - рабочий.
Но нет точно соответствующего механизма для отправки результатов с замыканиями обратно от рабочего к драйверу.
Для того, чтобы получить результаты - вам нужно вернуться из своей функции и использовать такие действия, как take()
или же collect()
, Но будьте осторожны - вы не хотите отправлять больше данных, чем может поместиться в памяти драйвера - в противном случае приложение Spark выбросит исключение из памяти.
Также вы не выполнили действие на вашем RDD mapValues
преобразование - так что в вашем примере никакие задачи не были выполнены на рабочих.
rdd = sc.parallelize([(x, x+1) for x in range(2, 5)])
def Fn(value):
return value*2
Li = rdd.mapValues(lambda x:Fn(x)).collect()
print Li
приведет к
[(2, 6), (3, 8), (4, 10)]
ЭДИ
После описания вашей проблемы (основываясь на моем понимании того, что вы хотите сделать):
L1 = range(20)
rdd = sc.parallelize(L1)
L2 = rdd.filter(lambda x: x % 2==0).collect()
print L2
>>> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]