1. 程式人生 > >spark程式——統計包含字元a或者b的行數

spark程式——統計包含字元a或者b的行數

本篇分析一個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。