Spark Scala 统计多个文件中的最大值与最小值 map自定义函数实现(二)

前言

上一章节我们了解到如何通过scala变成来统计一篇文章中的词频从而了解使用rdd当中函数使用,这篇我们进一步来学习熟练使用rdd函数,实现map自定义函数。

Spark-shell方式执行MaxAndMin map自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
本地文件(hdfs文件)内容,最大值与最小值为:645,0
[root@master201 maxAndmin]# hadoop fs -cat /lishijia/input/maxAndmin/*
56
78
54
1
2
3
645
544
878
565
21
12
32
52
5
0[root@master201 maxAndmin]#
  • textFile:通过内置的sc(SparkContext)对象调用textFile方法加载本地maxAndmin所有文件
  • filter:对记录过滤,去掉空格记录
  • map:通过map函数把本来只有一列的数据转换为(key,value)形式(因为spark的函数部分要求必须key,value形式,如:groupByKey,sortByKey,reduceByKey等),当中的tmpkey作为临时key,就是把所有数据分到一组
  • groupByKey:通过groupByKey函数,就会把所有数据分到一组即(key,Array)数据结构
  • map:通过自定义函数去寻找最大值与最小值(当中取值是通过一个元组的第二个value),最终只返回一个元组(tuple)数据结构的数据,包含最大值与最小值
  • collect:最后收集然后再调用println函数标准输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
scala> val lines = sc.textFile("file:///home/lishijia/Documents/spark/maxAndmin/*")
lines: org.apache.spark.rdd.RDD[String] = file:///home/lishijia/Documents/spark/maxAndmin/* MapPartitionsRDD[75] at textFile at <console>:24

scala> lines.filter(x=>x.trim().length>0).map(x=>("tmpkey", x.trim.toInt)).groupByKey().map(x=>{
| var index =0
| var min = 0;
| var max =0
| for(num <- x._2){
| if(index==0){
| min=num
| max=num
| index += 1
| }
|
| if(num<min){
| min=num;
| }
|
| if(max<num){
| max = num
| }
| }
| (min,max)
| }).collect().foreach(x=>{
| printf("the min is := %d, the max is := %d", x._1, x._2)
| println()
| })
the min is := 0, the max is := 645

总结

了解到filter,groupByKey等函数使用,并且实现map自定义函数即取最大值与最小值。

代码:https://github.com/lishijia/spark-scala-demo/tree/master/src/main/scala/lishijia/spark/demo

Centos虚拟机安装&NAT网络配置

Hadoop2.7.2集群安装

Scala & Spark2.0.2集群安装

Spark Scala WrodCount 入门(一)

分享到 评论