首页 > 解决方案 > 我如何使用 GroupBy 而不是 Map over Dataset?

问题描述

我正在使用Datasets并尝试分组,然后使用地图。

我正在设法使用 RDD 来做到这一点,但是对于分组后的数据集,我没有使用地图的选项。

有什么办法可以做到吗?

标签: scalaapache-sparkapache-spark-dataset

解决方案


您可以申请groupByKey

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

(特定于 Scala)返回一个 KeyValueGroupedDataset,其中数据按给定的键 func 分组。

返回KeyValueGroupedDataset然后mapGroups

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

(Scala-specific)将给定的函数应用于每组数据。对于每个唯一组,该函数将传递组键和包含组中所有元素的迭代器。该函数可以返回任意类型的元素,该元素将作为新数据集返回。

此函数不支持部分聚合,因此需要对 Dataset 中的所有数据进行混洗。如果应用程序打算对每个键执行聚合,最好使用 reduce 函数或 org.apache.spark.sql.expressions#Aggregator。

在内部,如果任何给定的组太大而无法放入内存,则实现将溢出到磁盘。但是,用户必须注意避免具体化组的整个迭代器(例如,通过调用 toList),除非他们确定在考虑到集群的内存限制的情况下这是可能的。


推荐阅读