Спасибо Джеймс. Похоже, что вопрос требует проверки всех различных форматов файлов, источников данных и размеров. Много работы и, конечно, зависит от версии Spark (так как все меняется с каждым выпуском).

чал оптимизацию запросов в последних выпусках Spark SQL 2.3.0-SNAPSHOT и заметил разные физические планы для семантически идентичных запросов.

Давайте предположим, что мне нужно посчитать количество строк в следующем наборе данных:

val q = spark.range(1)

Я мог бы посчитать количество строк следующим образом:

q.countq.collect.sizeq.rdd.countq.queryExecution.toRdd.count

Сначала я думал, что это почти постоянная операция (конечно, из-за локального набора данных), котораякак-то были оптимизированы Spark SQL и дали бы результат немедленно, особенно 1-й, где Spark SQL полностью контролирует выполнение запроса.

Изучив физические планы запросов, яверить что самый эффективный запрос будет последним:

q.queryExecution.toRdd.count

Причины таковы:

Это позволяет избежать десериализации строк из ихInternalRow двоичный форматЗапрос закодированЕсть только одна работа с одной стадией

Физический план так же прост.

Правильно ли мои рассуждения? Если да, будет ли другой ответ, если я прочитаю набор данных из внешнего источника данных (например, файлы, JDBC, Kafka)?

Главный вопрос заключается в том, какие факторы необходимо учитывать, чтобы сказать, является ли запрос более эффективным, чем другие (согласно этому примеру)?

Другие планы выполнения для полноты.

q.count

q.collect.size

q.rdd.count

Ответы на вопрос(2)

Ваш ответ на вопрос