Как я могу использовать GroupBy и чем Map поверх набора данных? - PullRequest
0 голосов
/ 23 января 2019

Я работаю с Datasets и пытаюсь сгруппировать, а затем использовать карту.

Мне удается сделать это с RDD, но с набором данных за группой, у меня нет возможности использовать карту.

Есть ли способ, которым я могу это сделать?

1 Ответ

0 голосов
/ 23 января 2019

Вы можете подать заявку groupByKey:

def groupByKey[K](func: (T) ⇒ K)(implicit arg0: Encoder[K]): KeyValueGroupedDataset[K, T]

(специфично для Scala) Возвращает KeyValueGroupedDataset, где данные группируются по заданной ключевой функции.

, который возвращает KeyValueGroupedDataset, а затем mapGroups:

def mapGroups[U](f: (K, Iterator[V]) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U]

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

Эта функция не поддерживает частичное агрегирование, и в результате требуется перетасовать все данные в наборе данных. Если приложение намеревается выполнить агрегацию по каждому ключу, лучше всего использовать функцию Reduce или org.apache.spark.sql.expressions # Aggregator.

Внутри, реализация выплескивается на диск, если какая-либо группа слишком велика для размещения в памяти. Однако пользователи должны позаботиться о том, чтобы избежать материализации всего итератора для группы (например, путем вызова toList), если они не уверены, что это возможно, учитывая ограничения памяти их кластера.

...