Spark開發-WordCount詳細講解Java版本

Xlucas發表於2017-09-16

核心
用Java開發spark的第一個應用程式wordcount

環境
idea
java1.7

案例

package com.xlucas;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.*;
import org.apache.spark.rdd.RDD;
import scala.Function1;
import scala.Tuple2;
import scala.collection.TraversableOnce;

import java.util.Arrays;


/**
 * Created by xlucas on 2017/9/16.
 * author :xlucas
 * blog:www.xlucas.com
 */
public class WordCount {
    public static void main(String[] args){
        /**
         第一步:建立spark的配置物件sparkconf,設定spark程式的執行時的配置資訊,例如說通過setMaster來設定程式
         連結spark叢集的master的URL,如果設定為local,則代表spark程式在本地執行,
         */
        SparkConf conf=new SparkConf().setAppName("WordCount").setMaster("local");
        /*
        第二步:建立JavaSparkContext物件,
        JavaSparkContext是spark程式所有功能的唯一入口,無論是採用Scala,Java,Python,R等都必須有一個JavaSparkContext
        JavaSparkContext核心作用:初始化spark應用程式執行時候所需要的核心元件,包括DAGScheduler,TaskScheduler,SchedulerBackend
        同時還會負責Spark程式往Master註冊程式等
                JavaSparkContext是整個spark應用程式中最為至關重要的一個物件
     */
        JavaSparkContext sc=new JavaSparkContext(conf);
        /*
    第3步:根據具體的資料來源 (HDFS,HBase,Local等)通過JavaSparkContext來建立JavaRDD
    JavaRDD的建立有3種方式,外部的資料來源,根據scala集合,由其他的RDD操作
    資料會被JavaRDD劃分成為一系列的Partitions,分配到每個Partition的資料屬於一個Task的處理範疇
     */
        JavaRDD<String> lines=sc.textFile("E://data//LICENSE.txt",1);
         /*
    第4步:對初始的JavaRDD進行Transformation級別的處理,例如Map、filter等高階函式等的程式設計來進行具體的資料計算
     在對每一行的字串拆分成單個單詞
     在單詞的拆分的基礎上對每個單詞例項計算為1,也就是word=>(word,1)
     在對每個單詞例項計數為1基礎上統計每個單詞在檔案中出現的總次數
     */
        JavaRDD<String> Words = lines.flatMap(new FlatMapFunction<String,String>(){
            @Override
            public Iterable<String> call(String line) throws Exception {
                return Arrays.asList(line.split(" "));
            }
        });

        JavaPairRDD<String,Integer> pairs=Words.mapToPair(new PairFunction<String,String,Integer>(){
            @Override
            public Tuple2<String, Integer> call(String word) throws Exception {
                return new Tuple2<String,Integer>(word,1);
            }
        });
        JavaPairRDD<String,Integer> wordscount=pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1+v2;
            }
        });

        wordscount.foreach(new VoidFunction<Tuple2<String, Integer>>() {
            @Override
            public void call(Tuple2<String, Integer> pairs) throws Exception {
                System.out.println(pairs._1+" : "+pairs._2);
            }
        });
    }
}

開發流程和Scala一樣的
先建立sparkConf–>JavaSparkContext—>JavaRDD等一系列操作

執行結果截圖
這裡寫圖片描述

相關文章