Spark 键值对操作

Spark 键值对操作

2019年11月22日

简介

键值对RDD通常用来进行聚合计算

键值对RDD在各节点上分布情况的高级特性:分区

使用可控的分区方式把常被一起访问的数据放到同一个节点上,可以大大减少应用的同学开销,带来明显的性能提升。

为分布式数据集选取正确的分区方式。

pair RDD提供 reduceByKey()方法,可以分别规约每个键对应的数据。

Join()方法,可以把两个RDD中键相同的元素组合到一起,合并为一个RDD

创建Pair RDD

  1. 存取键值对数据格式会在读取时直接返回其键值对数据组成的pair RDD。

  2. 普通RDD转为pair RDD时,可以调用map()函数实现,传递的函数需要返回键值对。

  • 在Scala中使用第一个单词作为键创建出一个pair RDD
val pairs = lines.map(x => (x.split(" ")(0), x))
  1. Scala从一个内存中的数据集创建pari RDD时,只需要对这个由二元组组成的集合调用SparkContext.parallelize()方法。

Pair RDD的转化操作

在这里插入图片描述
在这里插入图片描述

例:用Scala对第二个元素进行筛选

pairs.filter{
   case (key, value) => value.length < 20}

聚合操作

reduceByKey()与reduce()类似,对数据集中的每个键进行并行的规约操作,每个规约操作会将键相同的值合并起来。返回一个新的RDD。

例:计算每个键对应的平均值

rdd.mapValues(x => (x, 1)).reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))

在这里插入图片描述
例:用Scala实现单词计数

val input = sc.textFile("s3://...")

val words = input.flatMap(x => x.split(" "))

val result = words.map(x => (x, 1)).reduceByKey((x, y) => x + y)

针对单词计数,可以使用countByValue()函数,更快实现:

input.flatMap(x => x.split(" ")).countByValue()

combineByKey()是最为常用的基于键进行聚合的函数。和aggregate()一样,combineByKey()可以让用户返回与输入数据的类型不同的返回值。

combineByKey()有多个参数分别对应聚合操作的各个阶段,因而非常适合用来解释聚合操作各个阶段的功能划分。

例:在Scala中使用combineByKey()来求每个键对应的平均值


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值