Spark本地環境實現wordCount單詞計數

注:圖片如果損壞,點擊文章鏈接:https://www.toutiao.com/i6814778610788860424/

編寫類似MapReduce的案例-單詞統計WordCount

要統計的文件爲Spark的README.md文件

Spark本地環境實現wordCount單詞計數

 

分析邏輯:

1. 讀取文件,單詞之間用空格分割

2. 將文件裏單詞分成一個一個單詞

3. 一個單詞,計數爲1,採用二元組計數word ->(word,1)

4. 聚合統計每個單詞出現的次數

RDD的操作

Spark本地環境實現wordCount單詞計數

 

1.讀取文件:

sc.textFile("file:///opt/modules/spark/README.md")

注意:textFile裏面的路徑,如果沒有指定schema,那麼默認的話是從HDFS文件系統讀取數據,如果不加file://就是/opt/modules/spark/README.md的路徑,是從HDFS對應目錄下讀取

接收變量是res0

Spark本地環境實現wordCount單詞計數

 

res0方法查看

Spark本地環境實現wordCount單詞計數

 

可以用一個變量接收

Spark本地環境實現wordCount單詞計數

 

rdd.count-->統計RDD裏有多少條數據

Spark本地環境實現wordCount單詞計數

 

rdd.first--> 取RDD的第一條數據

Spark本地環境實現wordCount單詞計數

 

可以對比源文件看到第一條數據

Spark本地環境實現wordCount單詞計數

 

rdd.take(10)--> 取RDD的前10條數據,也可以對比源文件查看

Spark本地環境實現wordCount單詞計數

 

2. 將文件中的數據分成一個一個的單詞

Spark本地環境實現wordCount單詞計數

 

map和flatMap返回類型不一致,返回結果類型是RDD[String]和RDD[Array[String]]

Spark本地環境實現wordCount單詞計數

 

可以使用collect方法,查看結果

變量名

Spark本地環境實現wordCount單詞計數

 

collect方法

Spark本地環境實現wordCount單詞計數

 

map和flatMap返回結果的不同之處:flatMap會進行扁平化操作

mapRDD = rdd.map(line => line.split(" "))

第一個元素:Array("#","Apache","spark")

Spark本地環境實現wordCount單詞計數

 

第三個元素:Array("Spark","is")

Spark本地環境實現wordCount單詞計數

 

flatmapRDD = rdd.flatMap(line => line.split(" "))

第一個元素:"#"

Spark本地環境實現wordCount單詞計數

 

所以我們選擇flatMap,而不是map

val flatMapRDD = rdd.flatMap(line => line.split(" "))

//flatMapRDD: org.apache.spark.rdd.RDD[String]

去除空的字符串的操作

flatMapRDD.filter(word => word.nonEmpty)

Spark本地環境實現wordCount單詞計數

 

3. 將每個單詞進行計數

val mapRDD = flatMapRDD.map(word => (word,1))

Spark本地環境實現wordCount單詞計數

 

返回類型//mapRDD: org.apache.spark.rdd.RDD[(String, Int)]

Spark本地環境實現wordCount單詞計數

 

4.將相同的單詞放在一起進行value值得聚合

val reduceRDD = mapRDD.reduceByKey((a,b) => a + b)

//reduceRDD: org.apache.spark.rdd.RDD[(String, Int)]

Spark本地環境實現wordCount單詞計數

 

查看對比下(reduceByKey前後兩個變量的collect)

Spark本地環境實現wordCount單詞計數

 

鏈式編程寫法:

val result = sc.textFile("file:///opt/modules/o2o23/spark/README.md").flatMap(line => line.split(" ")).filter(word => word.nonEmpty).map(word => (word,1)).reduceByKey((a,b) => a + b).collect

Spark本地環境實現wordCount單詞計數

 

鏈式編程簡化寫法:

val result1 = sc.textFile("file:///opt/modules/o2o23/spark/README.md").flatMap(_.split(" ")).filter(_.nonEmpty).map((_,1)).reduceByKey(_+_).collect

Spark本地環境實現wordCount單詞計數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章