java-spark中有哪些常用法人算子?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)建站不只是一家網(wǎng)站建設的網(wǎng)絡公司;我們對營銷、技術、服務都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關注我們的成都網(wǎng)站設計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設質量和服務品質,在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術創(chuàng)新,服務升級,滿足企業(yè)一站式營銷型網(wǎng)站建設需求,讓再小的品牌網(wǎng)站設計也能產(chǎn)生價值!
Java主要應用于:1. web開發(fā);2. Android開發(fā);3. 客戶端開發(fā);4. 網(wǎng)頁開發(fā);5. 企業(yè)級應用開發(fā);6. Java大數(shù)據(jù)開發(fā);7.游戲開發(fā)等。
Spark的算子的分類
從大方向來說,Spark 算子大致可以分為以下兩類:
1)Transformation 變換/轉換算子:這種變換并不觸發(fā)提交作業(yè),完成作業(yè)中間過程處理。
Transformation 操作是延遲計算的,也就是說從一個RDD 轉換生成另一個 RDD 的轉換操作不是馬上執(zhí)行,需要等到有 Action 操作的時候才會真正觸發(fā)運算。
2)Action 行動算子:這類算子會觸發(fā) SparkContext 提交 Job 作業(yè)。
Action 算子會觸發(fā) Spark 提交作業(yè)(Job),并將數(shù)據(jù)輸出 Spark系統(tǒng)。
從小方向來說,Spark 算子大致可以分為以下三類:
1)Value數(shù)據(jù)類型的Transformation算子,這種變換并不觸發(fā)提交作業(yè),針對處理的數(shù)據(jù)項是Value型的數(shù)據(jù)。
2)Key-Value數(shù)據(jù)類型的Transfromation算子,這種變換并不觸發(fā)提交作業(yè),針對處理的數(shù)據(jù)項是Key-Value型的數(shù)據(jù)對。
3)Action算子,這類算子會觸發(fā)SparkContext提交Job作業(yè)。
引言
通常寫spark的程序用scala比較方便,畢竟spark的源碼就是用scala寫的。然而,目前java開發(fā)者特別多,尤其進行數(shù)據(jù)對接、上線服務的時候,這時候,就需要掌握一些spark在java中的使用方法了
一、map
map在進行數(shù)據(jù)處理、轉換的時候,不能更常用了
在使用map之前 首先要定義一個轉換的函數(shù) 格式如下:
Function<String, LabeledPoint> transForm = new Function<String, LabeledPoint>() {//String是某一行的輸入類型 LabeledPoint是轉換后的輸出類型 @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ù) 轉成向量 Vector feature = Vectors.dense(doubleArr); double label = Double.parseDouble(rowArr[0]); //構造用于分類訓練的數(shù)據(jù)格式 LabelPoint LabeledPoint point = new LabeledPoint(label, feature); return point; } };
需要特別注意的是:
1、call方法的輸入應該是轉換之前的數(shù)據(jù)行的類型 返回值應是處理之后的數(shù)據(jù)行類型
2、如果轉換方法中調用了自定義的類,注意該類名必須實現(xiàn)序列化 比如
public class TreeEnsemble implements Serializable { }
3、轉換函數(shù)中如果調用了某些類的對象,比如該方法需要調用外部的一個參數(shù),或者數(shù)值處理模型(標準化,歸一化等),則該對象需要聲明是final
然后就是在合適的時候調用該轉換函數(shù)了
JavaRDD<LabeledPoint> rdd = oriData.toJavaRDD().map(transForm);
這種方式是需要將普通的rdd轉成javaRDD才能使用的,轉成javaRDD的這一步操作不耗時,不用擔心
二、filter
在避免數(shù)據(jù)出現(xiàn)空值、0等場景中也非常常用,可以滿足sql中where的功能
這里首先也是要定義一個函數(shù),該函數(shù)給定數(shù)據(jù)行 返回布爾值 實際效果是將返回為true的數(shù)據(jù)保留
Function<String, Boolean> boolFilter = new Function<String, Boolean>() {//String是某一行的輸入類型 Boolean是對應的輸出類型 用于判斷數(shù)據(jù)是否保留 @Override public Boolean call(String row) throws Exception {//重寫call方法 boolean flag = row!=null; return flag; } };
通常該函數(shù)實際使用中需要修改的僅僅是row的類型 也就是數(shù)據(jù)行的輸入類型,和上面的轉換函數(shù)不同,此call方法的返回值應是固定為Boolean
然后是調用方式
JavaRDD<LabeledPoint> rdd = oriData.toJavaRDD().filter(boolFilter);
三、mapToPair
該方法和map方法有一些類似,也是對數(shù)據(jù)進行一些轉換。不過此函數(shù)輸入一行 輸出的是一個元組,最常用的方法是用來做交叉驗證 或者統(tǒng)計錯誤率 召回率 計算AUC等等
同樣,需要先定義一個轉換函數(shù)
Function<String, Boolean> transformer = new PairFunction<LabeledPoint, Object, Object>() {//LabeledPoint是輸入類型 后面的兩個Object不要改動 @Override public Tuple2 call(LabeledPoint row) throws Exception {//重寫call方法 通常只改動輸入?yún)?shù) 輸出不要改動 double predicton = thismodel.predict(row.features()); double label = row.label(); return new Tuple2(predicton, label); } });
關于調用的類、類的對象,要求和之前的一致,類需要實現(xiàn)序列化,類的對象需要聲明成final類型
相應的調用如下:
JavaPairRDD<Object, Object> predictionsAndLabels = oriData.mapToPair(transformer);
看完上述內(nèi)容,你們掌握java-spark中有哪些常用法人算子的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
分享文章:java-spark中有哪些常用法人算子
瀏覽地址:http://muchs.cn/article2/ihesoc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、外貿(mào)網(wǎng)站建設、微信公眾號、商城網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)