spark入门(三)键值对操作

1 简述

Spark为包含键值对类型的RDD提供了一些专有的操作。这些RDD被称为PairRDD。

 

2 创建PairRDD

2.1

在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成的PairRDD。

2.2

可以调用map()函数,将一个普通的RDD转换为PairRDD。 

scala 版:

 使用第一个单词作为作为键创建出一个PairRDD

val pairs = lines.map(x => s.split(" ")(0),  x)

 

 java版:

同样是使用第一个单词作为作为键创建出一个PairRDD

1 PairFunction<String, String> keyData = new PairFunction<String, String>() {
2     public Tuple2<String, String> call(String str) {
3         return new Tuple2(str.split(" ")[0],  str);
4     }
5 }

 

3 PairRDD的转化操作

表:对Pair RDD的转化操作(以键值对集合{(1,2),(3,4),(3,6)}为例)

表:针对两个pair RDD的转化操作(rdd={(1,2),(3,4),(3,6)} other ={(3,9)})

 

4 PairRDD的聚合操作 

4.1 scala

scala中使用mapValues()和reduceByKey()计算每个键对应的平均值:

用Scala实现单词计数:

1 val input=sc.textFile(path)
2 val word=input.flatMap(x=>x.split(" "))
3 val result=word.map(s=>(x,1)).reduceByKey((x,y)=>(x+y))

 

4.2 java 

用Java实现单词计数:

 1 public class WordCount implements Serializable {
 2      private static final long serialVersionUID = 1L;
 3      private final static SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount" );
 4      private final static JavaSparkContext sc = new JavaSparkContext( sparkConf);
 5      public void wordCount(){
 6            JavaRDD<String> input= sc.textFile("hdfs://hadoop:8020/words.txt" );
 7           JavaRDD<String> words= input.flatMap( new FlatMapFunction<String, String>() {
 8              private static final long serialVersionUID = 1L;
 9              @Override
10              public Iterator<String> call(String x ) throws Exception {
11                return Arrays.asList( x.split( " ")).iterator();
12                        }
13              });
14        JavaPairRDD<String, Integer> result=words .mapToPair(new PairFunction<String, String, Integer>() {
15               private static final long serialVersionUID = 1L;
16               @Override
17               public Tuple2<String, Integer> call(String x) throws Exception {
18                 return new Tuple2<String, Integer>(x, 1);
19                      }
20       }).reduceByKey( new Function2<Integer, Integer, Integer>() {  
21      private static final long serialVersionUID = 1L;
22      @Override
23      public Integer call(Integer x , Integer y ) throws Exception {  
24                return x +y ;
25                       }
26            });
27         }
28 }

 

posted @ 2017-11-29 23:52  强迫疒  阅读(319)  评论(0)    收藏  举报