искра sql где пункт после выбора - PullRequest
2 голосов
/ 28 января 2020

Рассмотрим следующий запрос spark- sql:

  Seq(("b", 2), ("d", 4), ("a", 1), ("c", 3))
  .toDF("letter", "number")
  .select($"letter")
  .where($"number" > 1)
  .show

Исходный запрос может быть даже разделен, и поведение остается:

val letters =
  Seq(("b", 2), ("d", 4), ("a", 1), ("c", 3))
  .toDF("letter", "number")
  .select($"letter")

letters
  .where($"number" > 1)
  .show

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

Почему можно включить $"number" в предложении where, когда должна остаться только буква?

РЕДАКТИРОВАТЬ 1 Вот объяснение:

letters.explain(true)
== Parsed Logical Plan ==
'Project [unresolvedalias('letter, None)]
+- Project [_1#76942 AS letter#76955, _2#76943 AS number#76956]
   +- LocalRelation [_1#76942, _2#76943]

== Analyzed Logical Plan ==
letter: string
Project [letter#76955]
+- Project [_1#76942 AS letter#76955, _2#76943 AS number#76956]
   +- LocalRelation [_1#76942, _2#76943]

== Optimized Logical Plan ==
LocalRelation [letter#76955]

== Physical Plan ==
LocalTableScan [letter#76955]

1 Ответ

2 голосов
/ 28 января 2020

Присущий подходу Spark, объединение кода в действии / задании, в рабочей области -> узкие преобразования.

Spark оптимизирует код. Множество примеров этого.

val rdd1 = ...
val rdd2 = rdd1.map(...
val rdd3 = rdd2.map(...

Когда происходит действие, в этом тривиальном примере может не быть даже rdd2, rdd1 из-за оптимизации и слияния кода.

В вашем случае вы можете объединить все это вместе и просто получить простое сканирование локальной таблицы.

Вы можете взглянуть на https://spoddutur.github.io/spark-notes/second_generation_tungsten_engine.html, чтобы дать представление о слиянии код, также известный как генерация кода всего этапа.

...