? ?键值对抽样(对抽样是火花中许多操作所需要的常见数据类型,通常用来进行聚合计算。
创建对抽样
? ?火花有多种方式可以创建抽样。比如:很多存储键值对的数据格式在读取时直接返回对抽样,通过地图()算子将普通的抽样转为抽样。
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()计算每个键对应值的均值。李>
<代码>抽样。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()计算单词统计李>
输入=
<代码> 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.火花核心之键值对操作