Есть ли в Spark эквивалент метода aggregateByKey для RDD в API DataFrame?
Наиболее распространенные операции агрегации в интерфейсе DataFrame можно выполнять с помощью agg
и уже определенного агрегатора, например. sum
, first
, max
и т. д. Если вы хотите сделать что-то вроде GROUP BY
и агрегации, а-ля SQL, вам следует сначала изучить эти существующие функции агрегации.
Однако метод aggregateByKey
предоставляет более сложную логику, которая позволяет реализовать некоторые сложные процедуры агрегирования. Если вы хотите сделать это, вы захотите использовать интерфейс набора данных, который очень похож на тот, к которому вы уже привыкли в RDD. В частности, рассмотрите возможность создания собственного агрегатора:
https://docs.databricks.com/spark/latest/spark-sql/udaf-scala.html
Там вы определяете методы агрегатора, такие как initialize
, merge
и т. д., которые указывают, как создать агрегатор, объединить отдельные элементы в агрегат и объединить промежуточные агрегаты вместе для исполнителей/задач.
Как только ваш агрегатор определен, вы можете использовать его в наборе данных, например.
ds.groupBy(_.myKey).agg(myCustomAggregator)
Для API фрейма данных используйте
groupBy
.