Этот вопрос немного неясен, но давайте попробуем внести некоторую ясность в простой пример.
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 истекает и они удаляются через сборщик мусора.
Это немного более продвинуто, но я оставлю это здесь, поскольку оно охватывает его суть. все.