国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

java-spark中各種常用算子的寫法示例

2024-07-14 08:41:18
字體:
來源:轉載
供稿:網友

Spark的算子的分類

從大方向來說,Spark 算子大致可以分為以下兩類:

1)Transformation 變換/轉換算子:這種變換并不觸發提交作業,完成作業中間過程處理。

Transformation 操作是延遲計算的,也就是說從一個RDD 轉換生成另一個 RDD 的轉換操作不是馬上執行,需要等到有 Action 操作的時候才會真正觸發運算。

2)Action 行動算子:這類算子會觸發 SparkContext 提交 Job 作業。

Action 算子會觸發 Spark 提交作業(Job),并將數據輸出 Spark系統。

從小方向來說,Spark 算子大致可以分為以下三類:

1)Value數據類型的Transformation算子,這種變換并不觸發提交作業,針對處理的數據項是Value型的數據。

2)Key-Value數據類型的Transfromation算子,這種變換并不觸發提交作業,針對處理的數據項是Key-Value型的數據對。

3)Action算子,這類算子會觸發SparkContext提交Job作業。

引言

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

一、map

map在進行數據處理、轉換的時候,不能更常用了

在使用map之前 首先要定義一個轉換的函數 格式如下:

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 然后放到數組中 for (int i = 1; i < rowSize; i++) {  String each = rowArr[i];  doubleArr[i] = Double.parseDouble(each); }  //用剛才得到的數據 轉成向量 Vector feature = Vectors.dense(doubleArr); double label = Double.parseDouble(rowArr[0]); //構造用于分類訓練的數據格式 LabelPoint LabeledPoint point = new LabeledPoint(label, feature); return point; } };

需要特別注意的是:

1、call方法的輸入應該是轉換之前的數據行的類型  返回值應是處理之后的數據行類型

2、如果轉換方法中調用了自定義的類,注意該類名必須實現序列化 比如

public class TreeEnsemble implements Serializable {}

3、轉換函數中如果調用了某些類的對象,比如該方法需要調用外部的一個參數,或者數值處理模型(標準化,歸一化等),則該對象需要聲明是final

然后就是在合適的時候調用該轉換函數了

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

這種方式是需要將普通的rdd轉成javaRDD才能使用的,轉成javaRDD的這一步操作不耗時,不用擔心

二、filter

在避免數據出現空值、0等場景中也非常常用,可以滿足sql中where的功能

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

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

通常該函數實際使用中需要修改的僅僅是row的類型 也就是數據行的輸入類型,和上面的轉換函數不同,此call方法的返回值應是固定為Boolean

然后是調用方式

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

三、mapToPair

該方法和map方法有一些類似,也是對數據進行一些轉換。不過此函數輸入一行 輸出的是一個元組,最常用的方法是用來做交叉驗證 或者統計錯誤率 召回率 計算AUC等等

同樣,需要先定義一個轉換函數

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

關于調用的類、類的對象,要求和之前的一致,類需要實現序列化,類的對象需要聲明成final類型

相應的調用如下:

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

然后對該predictionsAndLabels的使用,計算準確率、召回率、精準率、AUC,接下來的博客中會有,敬請期待

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻城市| 沙河市| 垣曲县| 正蓝旗| 辽阳市| 凌云县| 鄂伦春自治旗| 眉山市| 新巴尔虎右旗| 论坛| 南昌县| 油尖旺区| 衢州市| 奉新县| 安丘市| 文登市| 泗洪县| 临猗县| 内乡县| 库尔勒市| 新闻| 康定县| 集安市| 霍邱县| 海南省| 阳原县| 旺苍县| 梅河口市| 宁津县| 乌拉特后旗| 沽源县| 长海县| 二连浩特市| 太湖县| 古蔺县| 保定市| 德庆县| 新源县| 鄂托克前旗| 合作市| 中卫市|