В исходниках содержится ответ на вопрос, и, спойлер,
@asm0dey в целом прав, но судит разработчиков с высоты своего уровня (то есть, переоценивает обдуманность решений). Я скопирую часть скаладока и сигнатуру agg из класса org.apache.spark.sql.RelationalGroupedDataset:
/**
….
* Note that before Spark 1.4, the default behavior is to NOT retain grouping columns. To change
* to that behavior, set config variable spark.sql.retainGroupColumns to false.
* {{{
* // Scala, 1.3.x:
* df.groupBy("department").agg($"department", max("age"), sum("expense"))
*
* // Java, 1.3.x:
* df.groupBy("department").agg(col("department"), max("age"), sum("expense"));
* }}}
*
* @since 1.3.0
*/
spark.sql.retainGroupColumns
to
false
.
* {{{
* // Scala, 1.3.x:
* df.groupBy("department").agg($"department", max("age"), sum("expense"))
*
* // Java, 1.3.x:
* df.groupBy("department").agg(col("department"), max("age"), sum("expense"));
* }}}
*
*
@since @since 1.3.0
*/
@scala.annotation.varargs
def agg(expr: Column, exprs: Column*): DataFrame = {???}
Класс до 2.0.0 назывался
GroupedData. Методы agg в классе org.apache.spark.sql.Dataset являются обертками для вызова groupBy() и последующего обращения к методу agg из класса RelationalGroupedDataset
Как видим, в 1.3.0 колонки, по которым шла группировка не выводились, поэтому, чтобы привыкшие к ораклу и прочим SQL RDBMS пользователи не фрустрировали, нужна была подсказка, чтобы они не забывали выводить группируемые колонки, если они вообще присутствуют
Варианты agg с Map[String, String] c 1.3.0 выводили групповые поля, поэтому сразу же шли в сигнатуре, допускающей передачу пустого списка
Можно подумать, что это сделано, чтобы пользователи не забывали писать хотя бы одно выражение для группировки, если агрегация выполняется на всем наборе данных. Например, count(*) на пустом датафрейме должен выдать датафрейм с одной строкой и значением 0, а не пустой датафрейм с полем count. Но agg c пустым Map вполне валидно выполняется и выводит совершенно пустой датафрейм, значит, внутренних препятствий для такого использования не было, и даже можно быстро написать класс, который будет вызывать именно такую операцию без обращения к промежуточным agg