Зачем нужно кэшировать DataFrame, когда данные уже кэшированы в локальной переменной за сеанс? - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в Spark. Пытаясь понять, как Cache и Persist работает.

Я понимаю необходимость кэшировать любой DataFrame, если на эти данные ссылаются другие операции спарка.

НО ..

Я выполнил WordCount на 11 ГБ файле:

spark.read.textFile("file:///g:/dummy.txt")
 res1.flatMap(_.split(" ")).map(word => (word,1))
 res3.rdd.reduceByKey.toDF

и получил:

res4: org.apache.spark.sql.DataFrame = [_1: string, _2: int]

Когда я звоню res4.show spark начинает выполнение, и все задачи выполняются. После его завершения я снова вызываю res4.show, но на этот раз он напрямую возвращает мне данные в консоли.

Вопрос в том, что: res4 доступно в текущем сеансе спарка, тогда я хочу сделать res4.cache даже если это легко доступно? Если да, то каков охват res4?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Этот вопрос немного неясен, но давайте попробуем внести некоторую ясность в простой пример.

1) Вот как вы делаете lowerByKey :

val f = spark.read.textFile("/FileStore/tables/jjj.txt")
val g = f.flatMap(_.split(" ")).map(word => (word,1))
val h = g.rdd.reduceByKey((a, b) => a + b).toDF()
h.show()
h.show()

2) h.show() является специальным действием, но тем не менее действием. Во второй раз он может использовать пропущенную обработку, результаты, которые уже есть на диске / в памяти и могут быть доступны немедленно без повторного вычисления. Например:

(2) Spark Jobs
Job 4 View(Stages: 2/2)
Job 5 View(Stages: 1/1, 1 skipped)

Более подробное объяснение

Пропущено означает, что данные могут быть получены из кэша (памяти или диска), поэтому не требуется никакого нового отдельного действия, т.е. -исполнение (этапа). Это зависит от того, что вы кодируете.

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

Это немного более продвинуто, но я оставлю это здесь, поскольку оно охватывает его суть. все.

0 голосов
/ 26 марта 2020

Cache / Persist полезны, когда вы хотите, чтобы данные (res4) использовались при вычислении любого другого вывода.

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

И теперь у меня есть запрос на выборку слов с 10 буквами, тогда, если res4 кэшируется, скорость будет намного быстрее, поскольку искровой двигатель уже имеет res4 в памяти. Если он не кэшируется, то каждое действие будет пересчитываться.

Для получения более подробной информации, пожалуйста, обратитесь к https://spark.apache.org/docs/latest/rdd-programming-guide.html

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