2

RDDRDD имеет очень полезную совокупность методов, которая позволяет накапливать нулевое значение и комбинировать его между разделами. Есть ли способ сделать это с помощью Dataset[T]. Насколько я вижу спецификацию через Scala doc, на самом деле ничего не получается. Даже метод reduce позволяет делать вещи только для двоичных операций с T как оба аргумента. Почему? И если есть что-то способное сделать то же самое?Агрегация Spark Dataset, аналогичная агрегату RDD (ноль) (накопитель, сумматор)

Большое спасибо!

В.К.

ответ

3

Есть два различных класса, которые могут быть использованы для достижения aggregate -like поведения в Dataset API:

  • UserDefinedAggregateFunction который использует SQL типы и принимает Columns в качестве входных данных.

    Начальное значение определяется с использованием метода initialize, seqOp с update методом и combOp с merge методом.

    Пример реализации: How to define a custom aggregation function to sum a column of Vectors?

  • Aggregator, который использует стандартные типы Scala с Encoders и принимает записи в качестве входных данных.

    Начальное значение определяется с использованием метода zero, seqOp с reduce методом и combOp с merge методом.

    Пример реализации: How to find mean of grouped Vector columns in Spark SQL?

Оба обеспечивают дополнительный метод финализации (evaluate и finish соответственно), который используется для генерации конечных результатов и может быть использован как для глобальных и с помощью ключа агрегации.