spark2.x由淺入深深到底系列六之RDD java api調用scala api的原理

來源:互聯網
上載者:User

標籤:spark   大資料   javaapi   老湯   rdd   

RDD java api其實底層是調用了scala的api來實現的,所以我們有必要對java api是怎麼樣去調用scala api,我們先自己簡單的實現一個scala版本和java版本的RDD和SparkContext


一、簡單實現scala版本的RDD和SparkContext

class RDD[T](value: Seq[T]) {  //RDD的map操作  def map[U](f: T => U): RDD[U] = {    new RDD(value.map(f))  }    def iterator[T] = value.iterator  }class SparkContext {  //建立一個RDD  def createRDD(): RDD[Integer] = new RDD[Integer](Seq(1, 2, 3))}


二、簡單實現java版本的RDD和SparkContext

//這個時java中的一個介面//我們可以將scala中的map需要的函數其實就是對應著java中的一個介面package com.twq.javaapi.java7.function;public interface Function<T1, R> extends Serializable {  R call(T1 v1) throws Exception;}//這邊實現的java版的RDD和SparkContext其實還是用scala代碼實現,只不過這些scala代碼可以被java代碼調用了import java.util.{Iterator => JIterator}import scala.collection.JavaConverters._import com.twq.javaapi.java7.function.{Function => JFunction}//每一個JavaRDD都會含有一個scala的RDD,用於調用該RDD的apiclass JavaRDD[T](val rdd: RDD[T]) {  def map[R](f: JFunction[T, R]): JavaRDD[R] =    //這裡是關鍵,調用scala RDD中的map方法    //我們將java的介面構造成scala RDD的map需要的函數函數    new JavaRDD(rdd.map(x => f.call(x)))  //我們需要將scala的Iterator轉成java版的Iterator  def iterator: JIterator[T] = rdd.iterator.asJava}//每個JavaSparkContext含有一個scala版本的SparkContextclass JavaSparkContext(sc: SparkContext) {  def this() = this(new SparkContext())  //轉調scala版本的SparkContext來實現JavaSparkContext的功能  def createRDD(): JavaRDD[Integer] = new JavaRDD[Integer](sc.createRDD())}

三、寫java代碼調用rdd java api

package com.twq.javaapi.java7;import com.twq.javaapi.java7.function.Function;import com.twq.rdd.api.JavaRDD;import com.twq.rdd.api.JavaSparkContext;import java.util.Iterator;/** * Created by tangweiqun on 2017/9/16. */public class SelfImplJavaRDDTest {    public static void main(String[] args) {        //初始化JavaSparkContext        JavaSparkContext jsc = new JavaSparkContext();        //調用JavaSparkContext的api建立一個RDD        JavaRDD<Integer> firstRDD = jsc.createRDD();        //對建立好的firstRDD應用JavaRDD中的map操作        JavaRDD<String> strRDD = firstRDD.map(new Function<Integer, String>() {            @Override            public String call(Integer v1) throws Exception {                return v1 + "test";            }        });        //將得到的RDD的結果列印,結果為        //1test        //2test        //3test        Iterator<String> result = strRDD.iterator();        while (result.hasNext()) {            System.out.println(result.next());        }    }}


以上就是RDD java api調用scala api的實現原理,雖然只舉了map操作,但是其他的類似於flatMap操作的實現都是類似的


接下來可以詳細瞭解RDD java的每一個api了


我們可以參考spark core RDD api來詳細理解scala中的每一個api。。。

spark2.x由淺入深深到底系列六之RDD java api調用scala api的原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.