2015-11-19 4 views
5

Мне хотелось бы вернуть строки из моего RDD по одному (или небольшими партиями), чтобы я мог собирать строки локально, когда они мне нужны. Мой RDD достаточно велик, что он не может вписаться в память на узле имени, поэтому запуск collect() приведет к ошибке.собирать RDD с буфером в pyspark

Есть ли способ воссоздать операцию collect(), но с генератором, так что строки из RDD передаются в буфер? Другим вариантом будет take() 100000 строк за раз из кэшированного RDD, но я не думаю, что take() позволяет указать начальную позицию?

+1

Есть ли что-то, что заставляет вас избегать «saveAsTextFile»? Потому что вы можете очистить все до файла, а затем прочитать его через буфер. –

+0

@ paul-k В настоящее время я использую saveAsTextFile, однако у этого есть пара проблем: 1) время чтения медленное, потому что это текстовые файлы, и 2) я теряю информацию о типах данных, поэтому «1» совпадает с 1 – mgoldwasser

+0

Это правда 2) все еще проблема, но вы все равно можете писать информацию о типе, хотя это не очень экономично с точки зрения размера файла. вы также можете вызвать SaveAsPickleFile для сериализации объектов. 1) Я не думаю, что это было бы медленнее, чем фактическая реализация 'collect', поскольку она читается из временного файла в соответствии с документами: ps: //spark.apache.org/docs/0.7.2/api/pyspark /pyspark.rdd-pysrc.html#RDD.collect –

ответ

5

Лучшая доступная опция - использовать RDD.toLocalIterator, которая собирает только один раздел в то время. Это создает стандартный генератор Python:

rdd = sc.parallelize(range(100000)) 
iterator = rdd.toLocalIterator() 
type(iterator) 

## generator 

even = (x for x in iterator if not x % 2) 

Вы можете настроить количество данных, собранных в одном пакете с использованием конкретной разметки и регулировочных ряд разделов.

К сожалению, это связано с ценой. Чтобы собрать небольшие партии, вам нужно запустить несколько работ Spark, и это довольно дорого. Так что вообще говоря, собирать элемент в то время не вариант.

+0

Просто хотел добавить небольшую заметку, это отлично работает с 'glom()', если вы хотите, чтобы итератор возвращал один список для каждого раздела. – numeral

Смежные вопросы