Почему Dataset.unpersist распространяется каскадно на все зависимые кэшированные наборы данных? - PullRequest
0 голосов
/ 01 января 2019

Я использую искру 2.3.2.Для моего случая использования я кэширую первый и второй фреймы данных.

Пытаюсь повторить то же самое.

scala> val df = spark.range(1, 1000000).withColumn("rand", (rand * 100).cast("int")).cache
df: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [id: bigint, rand: int]

scala> df.count
res0: Long = 999999                                                             

scala> val aggDf = df.groupBy("rand").agg(count("id") as "count").cache
aggDf: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [rand: int, count: bigint]

scala> aggDf.count
res1: Long = 100   

Как видно из рисунка ниже, есть два RDD длякаждый кадр данных.

enter image description here

Теперь, когда я собираюсь на unpersist мой первый фрейм данных, искра не разделяет оба.

df.unpersist()

Пытаясь понять это странное поведение, почему spark отменяет сопротивление в обоих информационных кадрах, а не в первом?
Я что-то упустил?

1 Ответ

0 голосов
/ 01 января 2019

Цитирование SPARK-21478 Unpersist DF также отменяет защиту связанных DF :

Это сделано специально.Мы не хотим использовать неверные кэшированные данные.

Текущий дизайн кэша должен гарантировать правильность запроса.Если вы хотите сохранить кэшированные данные, даже если данные устарели.Вам нужно материализовать его, сохранив его в виде таблицы.

Что, однако, было изменено в 2.4.0 в SPARK-24596 Не каскадное недопустимое кэширование :

При аннулировании кэша мы делаем недействительными другие кэши, зависящие от этого кэша, чтобы обеспечить актуальность кэшированных данных.Например, когда базовая таблица была изменена или сама таблица была удалена, все кэши, использующие эту таблицу, должны быть аннулированы или обновлены.

Однако в других случаях, например, когда пользователь просто хочет удалитькэш для освобождения памяти, нам не нужно аннулировать зависимые кэши, так как никакие данные не были измененыПо этой причине мы хотели бы ввести новый режим аннулирования кэша: не каскадный аннулирование кэша.

Поскольку вы используете 2.3.2, вы должны следовать рекомендации, чтобы сохранить в таблицуили обновиться до 2.4.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...