Я пишу конвейер для очень большого кадра данных. Чтобы быстро создать прототип, я пытаюсь кэшировать небольшое количество выборок из фрейма данных.
Я ожидал, что смогу эффективно добиться этого, выполнив приведенный ниже код.
df.limit(1).cache().collect()
Однако, как показано на рисунке ниже, это создает две стадии, первая из которых кэширует полный фрейм данных (например, игрушка размером 99,3 ГБ).
Этапы Spark с кешем ()
Это удивительно, потому что когда я удаляю метод кэширования (оставляя df.limit(1).collect()
), Spark порождает этап сбора, который является толькоприменяется на одном разделе в моем фрейме данных. См. Рисунок ниже.
Ступени искры без кеша ()
Такое же различие наблюдается и при сравнении ступеней при объединении лимита с показом / сбором / извлечением (этап содин раздел) vs count (этап с полным фреймом данных).
Хотя я могу ускорить этот кэш, отфильтровав один раздел вручную, я все еще сталкиваюсь со следующими двумя вопросами:
- Какой самый эффективный способ кэширования выборки данных из большого фрейма данных?
- Почему .cache () кэширует полный фрейм данных, когда на запрос накладывается ограничение, тогда как тот же запрос безcache () не касается полного кадра данных?