Спасибо Джеймс. Похоже, что вопрос требует проверки всех различных форматов файлов, источников данных и размеров. Много работы и, конечно, зависит от версии Spark (так как все меняется с каждым выпуском).
чал оптимизацию запросов в последних выпусках Spark SQL 2.3.0-SNAPSHOT и заметил разные физические планы для семантически идентичных запросов.
Давайте предположим, что мне нужно посчитать количество строк в следующем наборе данных:
val q = spark.range(1)
Я мог бы посчитать количество строк следующим образом:
q.count
q.collect.size
q.rdd.count
q.queryExecution.toRdd.count
Сначала я думал, что это почти постоянная операция (конечно, из-за локального набора данных), котораякак-то были оптимизированы Spark SQL и дали бы результат немедленно, особенно 1-й, где Spark SQL полностью контролирует выполнение запроса.
Изучив физические планы запросов, яверить что самый эффективный запрос будет последним:
q.queryExecution.toRdd.count
Причины таковы:
Это позволяет избежать десериализации строк из ихInternalRow
двоичный форматЗапрос закодированЕсть только одна работа с одной стадиейФизический план так же прост.
Правильно ли мои рассуждения? Если да, будет ли другой ответ, если я прочитаю набор данных из внешнего источника данных (например, файлы, JDBC, Kafka)?
Главный вопрос заключается в том, какие факторы необходимо учитывать, чтобы сказать, является ли запрос более эффективным, чем другие (согласно этому примеру)?
Другие планы выполнения для полноты.
q.countq.collect.sizeq.rdd.count