spark程式——統計包含字元a或者b的行數
阿新 • • 發佈:2019-02-03
本篇分析一個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 { <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>public static void main(String[] args) { <span style="white-space:pre"> </span>String logFile = "file:///usr/local/spark/README.md"; // Should be some file on your system <span style="white-space:pre"> </span>SparkConf conf = new SparkConf().setAppName("Simple Application").setMaster("local"); <span style="white-space:pre"> </span>JavaSparkContext sc = new JavaSparkContext(conf); <span style="white-space:pre"> </span>JavaRDD<String> logData = sc.textFile(logFile).cache();<span style="white-space:pre"> </span>//將檔案cache在記憶體中 <span style="white-space:pre"> </span>long numAs = logData.filter(new Function<String, Boolean>() {<span style="white-space:pre"> </span>//保留包含a的元素 <span style="white-space:pre"> </span>public Boolean call(String s) { <span style="white-space:pre"> </span>return s.contains("a");<span style="white-space:pre"> </span>// <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>}).count();<span style="white-space:pre"> </span>//RDD元素總數 <span style="white-space:pre"> </span>long numBs = logData.filter(new Function<String, Boolean>() {<span style="white-space:pre"> </span>//String為輸入型別,保留Boolean為true元素 <span style="white-space:pre"> </span>public Boolean call(String s) { <span style="white-space:pre"> </span>return s.contains("b"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>}).count(); <span style="white-space:pre"> </span>System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs); <span style="white-space:pre"> </span>} }
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。