6.火花核心之键值对操作

  

? ?键值对抽样(对抽样是火花中许多操作所需要的常见数据类型,通常用来进行聚合计算。

  

创建对抽样

  

? ?火花有多种方式可以创建抽样。比如:很多存储键值对的数据格式在读取时直接返回对抽样,通过地图()算子将普通的抽样转为抽样。

  scala

  
 <代码> #使用第一个单词作为键创建一个抽样
  val双=线。地图(x=比;(x。分割(" ")(0),x))  
  

java

  
 <代码> #使用第一个单词作为键创建一个抽样
  # jdk1.8后也支持λ表达式方式
  PairFunction<字符串,字符串,String>keyData=https://www.yisu.com/zixun/new PairFunction <字符串,字符串,字符串> (){
  公共Tuple2 <字符串,字符串>调用(String x) {
  返回新Tuple2 (x。分割(" ")[0],x);
  }
  };
  String> JavaPairRDD<字符串;对=lines.mapToPair (keyData);  
  python

  
 <代码> #使用第一个单词作为键创建一个抽样
  对=线。地图(λx: (x。分割(" ")[0],x))  
  

? ?从一个内存中的数据集创建对抽样时,scala和python只需要对这个二元组集合调用SparkContext的并行化()方法即可,而java需要使用SparkContext.parallelizePairs()方法。

  

对抽样转化操作

  

转化操作总览

  
针对单两个抽样的转化操作
           函数名   作用   示例               reduceByKey(函数)   合并具有相同键的值   抽样。reduceByKey (x, y)=比;x + y)         groupByKey ()   对具有相同键的值进行分组   rdd.groupByKey ()         combineByKey (createCombiner mergeValue mergeCombiners,瓜分者)   使用不同的返回类型合并具有相同键的值   rdd.combineByKey (v=比;(1)v (acc: (Int, Int), v)=比;(acc)。_1 + v, acc。_2 + 1),(acc1: (Int, Int), acc2: (Int, Int))=比;(acc1。_1 + acc2。_1,acc1。_2 + acc2._2))         mapValues(函数)   对双抽样中的每个值应用一个函数而不改变键   抽样。mapValues (x=比;x + 1)         flatMapValues(函数)   对双抽样中的每个值应用一个返回迭代器的函数,生成对应原键的键值对记录   抽样。flatMapValues (x=比;(5)x)         键()   返回一个仅包含键的抽样   rdd.keys         值()   返回一个仅包含值得抽样   rdd.values         sortByKey ()   返回一个根据键排序的抽样   rdd.sortByKey ()            
针对两个对抽样的转化操作
           函数名   作用   示例               subtractByKey   删除抽样中键与其他抽样中键相同的元素   rdd.subtractByKey(其他)         加入   对两个抽样进行内连接   rdd.join(其他)         leftOuterJoin   对两个抽样进行连接操作,确保第二个抽样的键必须存在(左外连接)   rdd.leftOuterJoin(其他)         rightOuterJoin   对两个抽样进行连接操作,确保第一个抽样的键必须存在(右外连接)   rdd.rightOuterJoin(其他)         cogroup   将两个抽样中拥有相同键的数据分组在一起   rdd.cogroup(其他)            

聚合

  
      <李>使用mapValues()和reduceByKey()计算每个键对应值的均值。   
  scala
  
 <代码>抽样。mapValues (x=比;1)(x)。reduceByKey (x, y)=比;(x。_1 + y。_1,x。_2 + y._2)  
  python
  
 <代码>抽样。mapValues(λx (x, 1))。reduceByKey (x, y:λ(x + y [0] [0], [1] x + y[1]))  
  
      <李>使用flatMap(),()和地图reduceByKey()计算单词统计李   
  scala
  输入=
 <代码> val sc.textFile (s3://?
  val语言=输入。flatMap (x=比;x。分割(" "))
  val结果=单词。地图(x=比;1)(x)。reduceByKey (x, y)=比;x + y)  
  
java
  
 <代码> JavaRDD输入=sc.textFile (“s3://?;
  JavaRDD话说=输入。flatMap(新FlatMapFunction<字符串,String> () {
  公共Iterable字符串调用(x) {
  返回arrays . aslist (x。分割(" "));
  }
  });
  Integer> JavaPairRDD<字符串;结果=单词。mapToPair(新PairFunction<字符串,字符串,Integer> () {
  公共Tuple2<字符串,Integer>字符串调用(x) {
  返回新Tuple2 (x, 1);
  }
  }).reduceByKey (
  新的Function2<整数,整数,Integer> () {
  公共整数调用(整数,整数b) {
  返回一个+ b;
  }
  }
  )

6.火花核心之键值对操作