Spark编程汇总

1.WordCount

样例数据:
先用flatMap把所有数据根据“ ”分割单词并合成一个list;
map对list中的每个单词组合成(word,1);
reduceByKey将所有键值对根据key求value的和,即为每个单词的频数。

hello word bala bala
    val conf = new SparkConf().setAppName("test1")
    val sc = new SparkContext(conf)
    val rdd1 = sc.textFile(" ")
    val wordCount = rdd1.flatMap(line => line.split(" ")).map(word =>(word,1)).reduceByKey((a,b)=>a+b)
    wordCount.foreach(println)

py:

wordCount=rdd1.flatMap(lambda x:x.split(" ").map(lambda word:(word,1)).reduceByKey(lambda a,b : a+b).foreach(print)

2.文件中两列 科目、成绩。计算所有科目的平均成绩

样例数据:

'math' 90.0
'math' 89.0
'english' 90.0
'english' 88.0
.........

实现方式:利用combineByKey

def combineByKey[C](createCombiner: (V) => C,  
                    mergeValue: (C, V) => C,   
                    mergeCombiners: (C, C) => C): RD

createCombiner: combineByKey() 会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就
和之前的某个元素的键相同。如果这是一个新的元素, combineByKey() 会使用一个叫作 createCombiner() 的函数来创建
那个键对应的累加器的初始值
mergeValue: 如果这是一个在处理当前分区之前已经遇到的键, 它会使用 mergeValue() 方法将该键的累加器对应的当前值与这个新的值进行合并
mergeCombiners: 由于每个分区都是独立处理的, 因此对于同一个键可以有多个累加器。如果有两个或者更
多的分区都有对应同一个键的累加器, 就需要使用用户提供的 mergeCombiners() 方法将各
个分区的结果进行合并。

val conf = new SparkConf().setAppName("test1")
    val sc = new SparkContext(conf)
    val rdd1 = sc.textFile(" ")
    val ky = rdd1.map(line => line.split("    ")).map(x=>(x(1).toString,x(2).toFloat))
    val fin = ky.combineByKey(
      x =>(x,1),
      (c:kyType, x1)=>(c._1+x1,c._2+1),
     (c1: kyType,c2:kyType)=>(c1._1+c2._1,c1._2+c2._2)
    ).map({case(key,value)=>(key, value._1/value._2)})
    fin.collect.foreach(println)

等价于

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

mapValues所有value改为(value,1)。数值1表示这个key在rdd中出现了1次。
例如处理后为(“math”,(90.0,1));
reduceByKey对成绩和出现次数求和,例如,(“math”,(179.0,2))
mapValues对value键值对相除即为平均数
py:

ky.mapValues(lambda x:(x,1)).reduceByKey(lambda x,y : (x[0]+y[0],x[1]+y[1])).mapValues(lambda x:(x[0]/x[1]))

3.统计人口性别和身高
样例数据

1 F 170.0
2 M 178.0
3 M 174.0
4 F 165.0

统计所有男性、女性个数
过滤性别特征,统计个数

val manRdd = rdd1.filter(x=>x.contains("M"))
val manCount = manRdd.count()
val womanRdd = rdd1.filter(x=>x.contains("F"))
val womanCount = womanRdd .count()

统计男/女的最高、最低身高
如果是返回最高人的所有特征,则需先建立二元组(身高,item)
根据sortByKey排序,first()即为最高。
如果返回最高值,分割后取身高列,排序即可。

val highestMan = manRdd.map(x=>(x.split(" ")(2),x)).sortByKey(false).values.first()
val highest= manRdd.map(x=>x.split(" ")).map(t=>t(2)).sortBy(x=>x,false).first()

py:

rda = input_key_value.filter(lambda x:x[0]=='M')
rdb = input_key_value.filter(lambda x:x[0]=='F')
rdda = rda.map(lambda (x,y):(y,x)).sortByKey(False)

猜你喜欢

转载自blog.csdn.net/sky_noodle/article/details/83094902