toLocalIterator кажется пустым после его использования - PullRequest
1 голос
/ 06 мая 2020

Почему после сопоставления каждого раздела Spark DataFrame с Pandas Dataframe я могу только l oop на его разделы один раз?

Например, у меня будет вывод для этого

columns = sdf.schema.fieldNames()
parts = sdf.repartition(2).rdd.mapPartitions(lambda iterator: [pd.DataFrame(list(iterator), columns=columns)]).toLocalIterator()

for df in parts:
  print(df.shape)

Но в следующий раз, когда я запущу l oop:

for df in parts:
  print(df.shape)

, практически не будет времени вычислений или вывода.

1 Ответ

0 голосов
/ 06 мая 2020

toLocalIterator() возвращает Scala Iterator (через шлюз python s Java).

В Scala, Iterator расширяется черта TraversableOnce. Как следует из названия, его можно повторить только один раз (и только с помощью метода next()).

Вызов it.next() вернет следующий элемент итератора и продвинет состояние итератора. Повторный вызов next на том же итераторе приведет к получению элемента, превышающего тот, который был возвращен ранее. Если больше нет элементов для возврата, вызов next вызовет NoSuchElementException.

Если вам нужно дважды перебрать одну и ту же коллекцию, вы, вероятно, можете использовать duplicate() для получить два экземпляра итератора, которые можно обойти независимо.

...