Я пытаюсь взять очень большой RDD, работающий в кластере, и записать его в .csv. Он настолько велик, что .collect() ломается, поэтому вместо этого я хотел бы сохранить RDD по частям на каждом узле, а затем каким-то образом собрать их вместе, поскольку порядок не имеет значения. Моя идея состоит в том, чтобы использовать foreach с функцией принтера CSV, чтобы каждая часть записывала свои значения, а затем я мог бы собрать части вместе вручную, возможно, по FTP.
Я пользователь Spark с некоторым опытом, но на сегодняшний день мне никогда не удавалось заставить метод RDD foreach сделать что-нибудь полезное. Когда я пытаюсь запустить пример, приведенный в документации,
>>> def f(x): print x
>>> sc.parallelize([1, 2, 3, 4, 5]).foreach(f)
Я ничего не получаю обратно на свою консоль. Я считаю, что это связано с тем, что «печать» выполняется на отдельных узлах, а не на узле имени, где находится консоль. Однако в этом случае я действительно не вижу особого смысла в функции foreach!
Как я могу получить результаты моего возврата к узлу имени без предварительного вызова функции collect()?
NB. Я также открыт для использования RDD-функции saveAsTextFile(), но опять же мне не удалось заставить ее работать! Кажется, создается папка вместо текстового файла, хотя, возможно, это потому, что они существуют на каждом узле, а не централизованно?