Spark運算元:RDD基本轉換操作map、flatMap

後開啟撒打發了發表於2017-12-29
import org.apache.spark._

object rdd_test {

    System.setProperty("hadoop.home.dir", "C:\\hadoop_home\\")
    def main(args: Array[String]) {

        /*
         *  Spark運算元:RDD基本轉換操作之 map、flatMap、distinct學習筆記
         *
        */
        val sparkConf = new SparkConf().setMaster("local").setAppName("RDD_TEST_chenxun")
        val sc = new SparkContext(sparkConf)
        val lines = sc.textFile("D:\\spark_data\\data.txt")
        for (v <-lines) println(v)
        /*
          hello chen
          hello spark
          hello hadoop
       */

        //map操作
        val mapresult1 = lines.map(line => line.split(" ")).collect()
        //Array[Array[String]] = Array(Array(hello, chen), Array(hello, spark), Array(hello, hadoop))
        /*
            將一個RDD中的每個資料項,通過map中的函式對映變為一個新的元素。
            輸入分割槽與輸出分割槽一對一,即:有多少個輸入分割槽,就有多少個輸出分割槽

            mapresult.collect()結果是:(後面會比較flatMap的結果有什麼不同)
            Array[Array[String]] = Array(Array(hello, chen), Array(hello, spark), Array(hello, hadoop))

            可以用下面的方法輸出
            for (elem <- lines.map(line => line.split(" ")).collect()) {
                for(v <- elem){
                    print(v + " ")
                }
                println()
            }
        */

        //flatMap 操作
        val mapresult2 = lines.flatMap(line => line.split(" ")).collect()
        //Array[String] = Array(hello, chen, hello, spark, hello, hadoop)
        
        /* 屬於Transformation運算元,第一步和map一樣,最後將所有的輸出分割槽合併成一個。
            Array[String] = Array(hello, chen, hello, spark, hello, hadoop)
            for(elem <- mapresult2){
                println(elem)
            }
        */

        //計算每一行的長度
        val lineLengths = lines.map(s => s.length)
        for( v <- lineLengths){
            println(v)
        }

        val totalLength = lineLengths.reduce((a, b) => a + b)
        println(totalLength)

    }
}

相關文章