學(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)銷,網(wǎng)絡(luò)優(yōu)化,昭通網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(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操作,但是其他的類似于flatMap操作的實(shí)現(xiàn)都是類似的
接下來(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專題:https://edu.51cto.com/sd/16f3d
3、[老湯]Scala內(nèi)功修煉系列專題: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專題:https://edu.51cto.com/sd/d72af
分享文章:spark2.x由淺入深深到底系列六之RDDjavaapi調(diào)用scalaapi的原理
本文路徑:http://aaarwkj.com/article40/gpgjeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站改版、Google、全網(wǎng)營(yíng)銷推廣、用戶體驗(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)