spark2.x由淺入深深到底系列六之RDDjavaapi調(diào)用scalaapi的原理

學(xué)習(xí)spark任何的技術(shù)之前,請(qǐng)正確理解spark,可以參考:正確理解spark

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),昭通企業(yè)網(wǎng)站建設(shè),昭通品牌網(wǎng)站建設(shè),網(wǎng)站定制,昭通網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,昭通網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

RDD java api其實(shí)底層是調(diào)用了scala的api來(lái)實(shí)現(xiàn)的,所以我們有必要對(duì)java api是怎么樣去調(diào)用scala api,我們先自己簡(jiǎn)單的實(shí)現(xiàn)一個(gè)scala版本和java版本的RDD和SparkContext

一、簡(jiǎn)單實(shí)現(xiàn)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 {
  //創(chuàng)建一個(gè)RDD
  def createRDD(): RDD[Integer] = new RDD[Integer](Seq(1, 2, 3))

}

二、簡(jiǎn)單實(shí)現(xiàn)java版本的RDD和SparkContext

//這個(gè)時(shí)java中的一個(gè)接口
//我們可以將scala中的map需要的函數(shù)其實(shí)就是對(duì)應(yīng)著java中的一個(gè)接口
package com.twq.javaapi.java7.function;
public interface Function<T1, R> extends Serializable {
  R call(T1 v1) throws Exception;
}

//這邊實(shí)現(xiàn)的java版的RDD和SparkContext其實(shí)還是用scala代碼實(shí)現(xiàn),只不過(guò)這些scala代碼可以被java代碼調(diào)用了
import java.util.{Iterator => JIterator}
import scala.collection.JavaConverters._
import com.twq.javaapi.java7.function.{Function => JFunction}
//每一個(gè)JavaRDD都會(huì)含有一個(gè)scala的RDD,用于調(diào)用該RDD的api
class JavaRDD[T](val rdd: RDD[T]) {

  def map[R](f: JFunction[T, R]): JavaRDD[R] =
    //這里是關(guān)鍵,調(diào)用scala RDD中的map方法
    //我們將java的接口構(gòu)造成scala RDD的map需要的函數(shù)函數(shù)
    new JavaRDD(rdd.map(x => f.call(x)))
  //我們需要將scala的Iterator轉(zhuǎn)成java版的Iterator
  def iterator: JIterator[T] = rdd.iterator.asJava

}

//每個(gè)JavaSparkContext含有一個(gè)scala版本的SparkContext
class JavaSparkContext(sc: SparkContext) {
  def this() = this(new SparkContext())
  //轉(zhuǎn)調(diào)scala版本的SparkContext來(lái)實(shí)現(xiàn)JavaSparkContext的功能
  def createRDD(): JavaRDD[Integer] = new JavaRDD[Integer](sc.createRDD())
}

三、寫(xiě)java代碼調(diào)用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();
        //調(diào)用JavaSparkContext的api創(chuàng)建一個(gè)RDD
        JavaRDD<Integer> firstRDD = jsc.createRDD();
        //對(duì)創(chuàng)建好的firstRDD應(yīng)用JavaRDD中的map操作
        JavaRDD<String> strRDD = firstRDD.map(new Function<Integer, String>() {
            @Override
            public String call(Integer v1) throws Exception {
                return v1 + "test";
            }
        });
        //將得到的RDD的結(jié)果打印,結(jié)果為
        //1test
        //2test
        //3test
        Iterator<String> result = strRDD.iterator();
        while (result.hasNext()) {
            System.out.println(result.next());
        }
    }
}

以上就是RDD java api調(diào)用scala api的實(shí)現(xiàn)原理,雖然只舉了map操作,但是其他的類(lèi)似于flatMap操作的實(shí)現(xiàn)都是類(lèi)似的

接下來(lái)可以詳細(xì)了解RDD java的每一個(gè)api

我們可以參考spark core RDD api來(lái)詳細(xì)理解scala中的每一個(gè)api。。。

系統(tǒng)學(xué)習(xí)spark:
1、[老湯] Spark 2.x 之精講Spark Core:https://edu.51cto.com/sd/88429 
2、[老湯]Spark 2.x 之精講Spark SQL專(zhuān)題:https://edu.51cto.com/sd/16f3d 
3、[老湯]Scala內(nèi)功修煉系列專(zhuān)題:https://edu.51cto.com/sd/8e85b 
4、[老湯]Spark 2.x之精講Spark Streamig:https://edu.51cto.com/sd/8c525 
5、[老湯]Spark 2.x精講套餐:https://edu.51cto.com/sd/ff9a4 
6、從Scala到Spark 2.x專(zhuān)題:https://edu.51cto.com/sd/d72af

分享文章:spark2.x由淺入深深到底系列六之RDDjavaapi調(diào)用scalaapi的原理
本文路徑:http://muchs.cn/article40/gpgjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站改版、Google、全網(wǎng)營(yíng)銷(xiāo)推廣、用戶體驗(yàn)面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)