注:圖片如果損壞,點擊文章鏈接:https://www.toutiao.com/i6814778610788860424/
編寫類似MapReduce的案例-單詞統計WordCount
要統計的文件爲Spark的README.md文件
分析邏輯:
1. 讀取文件,單詞之間用空格分割
2. 將文件裏單詞分成一個一個單詞
3. 一個單詞,計數爲1,採用二元組計數word ->(word,1)
4. 聚合統計每個單詞出現的次數
RDD的操作
1.讀取文件:
sc.textFile("file:///opt/modules/spark/README.md")
注意:textFile裏面的路徑,如果沒有指定schema,那麼默認的話是從HDFS文件系統讀取數據,如果不加file://就是/opt/modules/spark/README.md的路徑,是從HDFS對應目錄下讀取
接收變量是res0
res0方法查看
可以用一個變量接收
rdd.count-->統計RDD裏有多少條數據
rdd.first--> 取RDD的第一條數據
可以對比源文件看到第一條數據
rdd.take(10)--> 取RDD的前10條數據,也可以對比源文件查看
2. 將文件中的數據分成一個一個的單詞
map和flatMap返回類型不一致,返回結果類型是RDD[String]和RDD[Array[String]]
可以使用collect方法,查看結果
變量名
collect方法
map和flatMap返回結果的不同之處:flatMap會進行扁平化操作
mapRDD = rdd.map(line => line.split(" "))
第一個元素:Array("#","Apache","spark")
第三個元素:Array("Spark","is")
flatmapRDD = rdd.flatMap(line => line.split(" "))
第一個元素:"#"
所以我們選擇flatMap,而不是map
val flatMapRDD = rdd.flatMap(line => line.split(" "))
//flatMapRDD: org.apache.spark.rdd.RDD[String]
去除空的字符串的操作
flatMapRDD.filter(word => word.nonEmpty)
3. 將每個單詞進行計數
val mapRDD = flatMapRDD.map(word => (word,1))
返回類型//mapRDD: org.apache.spark.rdd.RDD[(String, Int)]
4.將相同的單詞放在一起進行value值得聚合
val reduceRDD = mapRDD.reduceByKey((a,b) => a + b)
//reduceRDD: org.apache.spark.rdd.RDD[(String, Int)]
查看對比下(reduceByKey前後兩個變量的collect)
鏈式編程寫法:
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
鏈式編程簡化寫法:
val result1 = sc.textFile("file:///opt/modules/o2o23/spark/README.md").flatMap(_.split(" ")).filter(_.nonEmpty).map((_,1)).reduceByKey(_+_).collect