Spark RDD записать в глобальный список

Как записать в глобальный список с rdd?

 Li = []

 Fn(list):        
    If list.value == 4: 
        Li.append(1)
 rdd.mapValues(lambda x:fn(x))

Когда я пытаюсь напечатать Ли, результат: []

То, что я пытаюсь сделать, - это преобразовать еще один глобальный список Li1 при преобразовании объекта rdd. Однако, когда я делаю это, у меня всегда есть пустой список в конце. Li1 никогда не трансформируется.

1 ответ

Причина, по которой вы получаете Li значение установлено в [] после выполнения mapValues - это потому что 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]
Другие вопросы по тегам