java-spark中有哪些常用法人算子-創(chuàng)新互聯(lián)

java-spark中有哪些常用法人算子?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

我們注重客戶提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)服務(wù),我們努力開(kāi)拓更好的視野,通過(guò)不懈的努力,成都創(chuàng)新互聯(lián)贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),微信小程序開(kāi)發(fā),網(wǎng)站開(kāi)發(fā),技術(shù)開(kāi)發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫(kù)的技術(shù)開(kāi)發(fā)工程師。Java可以用來(lái)干什么

Java主要應(yīng)用于:1. web開(kāi)發(fā);2. Android開(kāi)發(fā);3. 客戶端開(kāi)發(fā);4. 網(wǎng)頁(yè)開(kāi)發(fā);5. 企業(yè)級(jí)應(yīng)用開(kāi)發(fā);6. Java大數(shù)據(jù)開(kāi)發(fā);7.游戲開(kāi)發(fā)等。

Spark的算子的分類

從大方向來(lái)說(shuō),Spark 算子大致可以分為以下兩類:

1)Transformation 變換/轉(zhuǎn)換算子:這種變換并不觸發(fā)提交作業(yè),完成作業(yè)中間過(guò)程處理。

Transformation 操作是延遲計(jì)算的,也就是說(shuō)從一個(gè)RDD 轉(zhuǎn)換生成另一個(gè) RDD 的轉(zhuǎn)換操作不是馬上執(zhí)行,需要等到有 Action 操作的時(shí)候才會(huì)真正觸發(fā)運(yùn)算。

2)Action 行動(dòng)算子:這類算子會(huì)觸發(fā) SparkContext 提交 Job 作業(yè)。

Action 算子會(huì)觸發(fā) Spark 提交作業(yè)(Job),并將數(shù)據(jù)輸出 Spark系統(tǒng)。

從小方向來(lái)說(shuō),Spark 算子大致可以分為以下三類:

1)Value數(shù)據(jù)類型的Transformation算子,這種變換并不觸發(fā)提交作業(yè),針對(duì)處理的數(shù)據(jù)項(xiàng)是Value型的數(shù)據(jù)。

2)Key-Value數(shù)據(jù)類型的Transfromation算子,這種變換并不觸發(fā)提交作業(yè),針對(duì)處理的數(shù)據(jù)項(xiàng)是Key-Value型的數(shù)據(jù)對(duì)。

3)Action算子,這類算子會(huì)觸發(fā)SparkContext提交Job作業(yè)。

引言

通常寫spark的程序用scala比較方便,畢竟spark的源碼就是用scala寫的。然而,目前java開(kāi)發(fā)者特別多,尤其進(jìn)行數(shù)據(jù)對(duì)接、上線服務(wù)的時(shí)候,這時(shí)候,就需要掌握一些spark在java中的使用方法了

一、map

map在進(jìn)行數(shù)據(jù)處理、轉(zhuǎn)換的時(shí)候,不能更常用了

在使用map之前 首先要定義一個(gè)轉(zhuǎn)換的函數(shù) 格式如下:

Function<String, LabeledPoint> transForm = new Function<String, LabeledPoint>() {//String是某一行的輸入類型 LabeledPoint是轉(zhuǎn)換后的輸出類型
 @Override
 public LabeledPoint call(String row) throws Exception {//重寫call方法
 String[] rowArr = row.split(",");
 int rowSize = rowArr.length;
 
 double[] doubleArr = new double[rowSize-1];
 
 //除了第一位的lable外 其余的部分解析成double 然后放到數(shù)組中
 for (int i = 1; i < rowSize; i++) {
  String each = rowArr[i];
  doubleArr[i] = Double.parseDouble(each);
 }
 
 //用剛才得到的數(shù)據(jù) 轉(zhuǎn)成向量
 Vector feature = Vectors.dense(doubleArr);
 double label = Double.parseDouble(rowArr[0]);
 //構(gòu)造用于分類訓(xùn)練的數(shù)據(jù)格式 LabelPoint
 LabeledPoint point = new LabeledPoint(label, feature);
 return point;
 }
 };

需要特別注意的是:

1、call方法的輸入應(yīng)該是轉(zhuǎn)換之前的數(shù)據(jù)行的類型  返回值應(yīng)是處理之后的數(shù)據(jù)行類型

2、如果轉(zhuǎn)換方法中調(diào)用了自定義的類,注意該類名必須實(shí)現(xiàn)序列化 比如

public class TreeEnsemble implements Serializable {
}

3、轉(zhuǎn)換函數(shù)中如果調(diào)用了某些類的對(duì)象,比如該方法需要調(diào)用外部的一個(gè)參數(shù),或者數(shù)值處理模型(標(biāo)準(zhǔn)化,歸一化等),則該對(duì)象需要聲明是final

然后就是在合適的時(shí)候調(diào)用該轉(zhuǎn)換函數(shù)了

JavaRDD<LabeledPoint> rdd = oriData.toJavaRDD().map(transForm);

這種方式是需要將普通的rdd轉(zhuǎn)成javaRDD才能使用的,轉(zhuǎn)成javaRDD的這一步操作不耗時(shí),不用擔(dān)心

二、filter

在避免數(shù)據(jù)出現(xiàn)空值、0等場(chǎng)景中也非常常用,可以滿足sql中where的功能

這里首先也是要定義一個(gè)函數(shù),該函數(shù)給定數(shù)據(jù)行 返回布爾值 實(shí)際效果是將返回為true的數(shù)據(jù)保留

Function<String, Boolean> boolFilter = new Function<String, Boolean>() {//String是某一行的輸入類型 Boolean是對(duì)應(yīng)的輸出類型 用于判斷數(shù)據(jù)是否保留
 @Override
 public Boolean call(String row) throws Exception {//重寫call方法
 boolean flag = row!=null;
 return flag;
 }
 };

通常該函數(shù)實(shí)際使用中需要修改的僅僅是row的類型 也就是數(shù)據(jù)行的輸入類型,和上面的轉(zhuǎn)換函數(shù)不同,此call方法的返回值應(yīng)是固定為Boolean

然后是調(diào)用方式

JavaRDD<LabeledPoint> rdd = oriData.toJavaRDD().filter(boolFilter);

三、mapToPair

該方法和map方法有一些類似,也是對(duì)數(shù)據(jù)進(jìn)行一些轉(zhuǎn)換。不過(guò)此函數(shù)輸入一行 輸出的是一個(gè)元組,最常用的方法是用來(lái)做交叉驗(yàn)證 或者統(tǒng)計(jì)錯(cuò)誤率 召回率 計(jì)算AUC等等

同樣,需要先定義一個(gè)轉(zhuǎn)換函數(shù)

Function<String, Boolean> transformer = new PairFunction<LabeledPoint, Object, Object>() {//LabeledPoint是輸入類型 后面的兩個(gè)Object不要改動(dòng)
 @Override
 public Tuple2 call(LabeledPoint row) throws Exception {//重寫call方法 通常只改動(dòng)輸入?yún)?shù) 輸出不要改動(dòng)
 double predicton = thismodel.predict(row.features());
 double label = row.label();
 return new Tuple2(predicton, label);
 }
 });

關(guān)于調(diào)用的類、類的對(duì)象,要求和之前的一致,類需要實(shí)現(xiàn)序列化,類的對(duì)象需要聲明成final類型

相應(yīng)的調(diào)用如下:

JavaPairRDD<Object, Object> predictionsAndLabels = oriData.mapToPair(transformer);

看完上述內(nèi)容,你們掌握java-spark中有哪些常用法人算子的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)頁(yè)題目:java-spark中有哪些常用法人算子-創(chuàng)新互聯(lián)
標(biāo)題URL:http://muchs.cn/article18/dpsdgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、動(dòng)態(tài)網(wǎng)站、企業(yè)建站、做網(wǎng)站、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(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)

外貿(mào)網(wǎng)站制作