本篇分析一個spark例子程序。
程序實現的功能是:分別統計包含字符a、b的行數。
java源碼如下:
package sparkTest;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
public class SimpleApp {
public static void main(String[] args) {
String logFile = "file:///usr/local/spark/README.md"; // Should be some file on your system
SparkConf conf = new SparkConf().setAppName("Simple Application").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD logData = sc.textFile(logFile).cache();//將文件cache在內存中
long numAs = logData.filter(new Function() {//保留包含a的元素
public Boolean call(String s) {
return s.contains("a");//
}
}).count();//RDD元素總數
long numBs = logData.filter(new Function() {//String為輸入類型,保留Boolean為true元素
public Boolean call(String s) {
return s.contains("b");
}
}).count();
System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
}
}
基本步驟解析如下:
1、設置sparkContext,包括sparkConf,讀取文件的地址和協議。
2、將文件內容cache()在內存中。經過實驗,不cache()也能執行顯示正確結果。
3、JavaRDD.filter()。對元素進行過濾,過濾的方法是函數Function(String, Boolean)。
具體定義在call(String s)中。
其中Function的參數String與call的參數String對應。Function的參數Boolean與call函數返回值Boolean類型對應。
返回Boolean為true的元素通過filter,保留在新生成的RDD中。
4、JavaRDD.count()對RDD元素個數進行統計。
5、最后,打印結果。
注意:這里的filter()、count()對應的就是transformation、action。