здесь - это исходный код To Pandas,
И, прежде всего, да, до Pandas будет быстрее, если ваш фрейм данных pyspark становится меньше, он имеет аналогичный на вкус как sdf.collect ()
Разница в том, чтобы Pandas вернуть pdf и собрать возвращать список.
Как видно из исходного кода pdf = pd.DataFrame.from_records(self.collect(), columns=self.columns)
pdf генерируется из pd.DataFrame.from_records from Список!
Так что, если ваш sdf меньше, там будет меньше данных для передачи по сети, и from_record
обрабатывает меньше данных, используя ЦП вашего драйвера.
Дизайн второго код другой, sdf распространяется, код вызывает Mappartition, поэтому все работники генерируют Pandas фрейм данных из подмножества данных, затем он вызывает метод сбора, теперь весь Pandas фрейм данных, передаваемый по сети, передается в драйвер , Затем код вызывает pd.concat для объединения всех данных.
Преимущества:
- При преобразовании в Pandas DataFrame все работники работают в небольшом подмножестве параллельные данные гораздо лучше, чем выводить все данные в драйвер и сжигать процессор вашего драйвера, чтобы преобразовать гигантские данные в Pandas.
- Идет перераспределение, то есть, если ваш набор данных огромен, и у вас есть Небольшое количество разделов, данные на каждом разделе будут огромными, и до Pandas будет сбой на OOM сериализатора, а также очень медленный сбор данных
Недостатки:
- теперь, когда вы собираете, вы не собираете собственные данные sdf, вместо pandas кадра данных, к которому прикреплено больше метаданных и обычно больше, что означает, что общий размер объекта больше
pd.concat
медленный лол, но все же может быть лучше, чем from_record
Так что нет универсального заключения о том, какой метод лучше, но выбирайте мудро, какой инструмент использовать. Как и в этом вопросе, Pandas может быть быстрее, чем маленький sdf, но для больших sdf фрагмент кода определенно работает лучше.