Я использую pyspark для обработки своих данных, и в самом конце мне нужно собрать данные из rdd, используя rdd.collect(). Однако моя искра падает из-за проблемы с памятью. Я пробовал несколько способов, но не повезло. Я теперь работает со следующим кодом, процесс небольшой фрагмент данных для каждого раздела:Какова наилучшая практика для сбора большого набора данных из искры rdd?
def make_part_filter(index):
def part_filter(split_index, iterator):
if split_index == index:
for el in iterator:
yield el
return part_filter
for part_id in range(rdd.getNumPartitions()):
part_rdd = rdd.mapPartitionsWithIndex(make_part_filter(part_id), True)
myCollection = part_rdd.collect()
for row in myCollection:
#Do something with each row
Новый код настоящее время я использую не откажет, но, кажется, работает навсегда.
Есть ли лучший способ сбора данных с большого rdd?
Вместо запуска для цикла в формате списка из RDD, почему бы вам не запустить функцию карты? –
На самом деле, мне нужно собрать все данные в rdd и сохранить в большом массиве, а затем подать модуль машинного обучения. – JamesLi
Возможно, модуль машинного обучения принимает итератор, или он действительно хочет массив? С помощью итератора вы можете не загружать сразу все данные в память. Даже тогда я буду беспокоиться о производительности, так как я предполагаю, что модуль машинного обучения собирается «съедать» данные одним потоком. –