Spark每日半小时(9)——PairRDD的数据分组

对于有键的数据,一个常见的用例是将数据根据键进行分组——比如查看一个顾客的所有订单。

groupByKey()

如果数据已经以预期的方式提取了键,groupByKey()就会使用RDD中的键来对数据进行分组。对于一个由类型K的键和类型V的值组成的RDD,所得到的结果RDD类型回事[K, Iterable[V]]。

groupBy()可以用于未成对的数据上,也可以根据除键相同以外的条件进行分组。它可以接收一个函数,对源RDD中的每个元素使用该函数,将返回结果作为键再进行分组。

如果你发现自己写出了先使用groupByKey()然后再对值使用reduce()或者fold()的代码,你很有可能可以通过使用一种根据键进行聚合的函数来更高效地实现同样的效果。对每个键归约数据,返回对应每个键的归约值的RDD,而不是把RDD归约为一个内存中的值。例如,rdd.reduceByKey(func)与rdd.groupByKey().mapValues(value => value.reduce(func))等价,但是前者更为高效,因为它避免了为每个键创建存放值的列表的步骤。

cogroup()

除了对单个RDD的数据进行分组,还可以使用一个叫做cogroup()的函数对多个共享同一个键的RDD进行分组。对两个键的类型均为K而值的类型分别为V和W的RDD进行cogroup()时,得到的结果RDD类型为 [(K, (Iterable[V], Iterable[W]))],如果其中的一个RDD对于另一个RDD中存在的某个键没有对应的记录,那么对应的迭代器则为空。cogroup()提供了为多个RDD进行数据分组的方法。

cogroup()不仅可以用于实现连接操作,还可以用来求键的交集。除此之外,cogroup()还能同时应用于三个及以上的RDD。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值