2017-02-14 2 views
0

Я создаю много новых столбцов с помощью withColumn и оконных операций (с Python/Spark). Это приводит к большой линии, которая замедляет работу. На самом деле, сохраняя DataFrame на диск, каждая пара шагов помогает много.Как принудительно сохранить память Spark DataFrames?

Но как я могу удобно кэшировать DataFrame в памяти и сила материализации так, что линия снижается?

(я видел предложения о count, но у меня сложилось впечатление, что работает только для РДУ?)

+0

'count' работает как' 'RDD' и DF' (поиск' count' здесь: http://spark.apache.org/docs/latest/sql-programming-guide.html) – Yaron

ответ

3

Прежде всего, граф будет работать на dataframe тоже. Любое действие, которое охватывает весь блок данных, будет достаточным (счетчик перебирает все записи и, следовательно, материализует весь блок данных).

Во-вторых, важно отметить, что линия не будет уменьшена путем кэширования. Вся линия будет анализироваться и оптимизироваться как часть генерации кода. Единственное отличие состоит в том, что многие шаги, вероятно, будут пропущены, поскольку будут использоваться данные, уже полученные из кеша (BTW, это не всегда так, бывают случаи, когда оптимизатор может решить пересчитать на основе его внутренних эвристик).

Существует два способа сократить линию на кадре данных.

  1. Запишите на диск и перезагрузите (который разрезает линию к части «чтения»).
  2. Используйте контрольную точку (которая за кулисами также сохраняет и загружает).

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

+0

Гарантировано ли, что 'count' не оптимизирует и не пропустит вычисления? Поскольку конечный 'withColumn' не изменит результат' count'? В какой момент «кеш» материализуется? Потому что 'cache' сам по себе ничего не делает, поэтому нет данных, кэшированных до самого конца, когда полная линия уже существует ?! – Gerenuk

+0

Я не уверен на 100%, когда вы делаете один кеш за другим, но в целом он должен работать. Пока это всегда работало для меня ... Вы можете просто попробовать и проверить, что происходит ... –

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