通常写spark的程序用scala比较方便,毕竟spark的源码就是用scala写的。然而,目前java开发者特别多,尤其进行数据对接、上线服务的时候,这时候,就需要掌握一些spark在java中的使用方法了

一、map

map在进行数据处理、转换的时候,不能更常用了

在使用map之前 首先要定义一个转换的函数 格式如下:

  1. Function<String, LabeledPoint> transForm = new Function<String, LabeledPoint>() {//String是某一行的输入类型 LabeledPoint是转换后的输出类型
  2. @Override
  3. public LabeledPoint call(String row) throws Exception {//重写call方法
  4. String[] rowArr = row.split(",");
  5. int rowSize = rowArr.length;
  6.  
  7. double[] doubleArr = new double[rowSize-1];
  8.  
  9. //除了第一位的lable外 其余的部分解析成double 然后放到数组中
  10. for (int i = 1; i < rowSize; i++) {
  11. String each = rowArr[i];
  12. doubleArr[i] = Double.parseDouble(each);
  13. }
  14.  
  15. //用刚才得到的数据 转成向量
  16. Vector feature = Vectors.dense(doubleArr);
  17. double label = Double.parseDouble(rowArr[0]);
  18. //构造用于分类训练的数据格式 LabelPoint
  19. LabeledPoint point = new LabeledPoint(label, feature);
  20. return point;
  21. }
  22. };

  需要特别注意的是:

1、call方法的输入应该是转换之前的数据行的类型  返回值应是处理之后的数据行类型

2、如果转换方法中调用了自定义的类,注意该类名必须实现序列化 比如

  1. public class TreeEnsemble implements Serializable {
  2. }

  3、转换函数中如果调用了某些类的对象,比如该方法需要调用外部的一个参数,或者数值处理模型(标准化,归一化等),则该对象需要声明是final

然后就是在合适的时候调用该转换函数了

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

  这种方式是需要将普通的rdd转成javaRDD才能使用的,转成javaRDD的这一步操作不耗时,不用担心

二、filter

在避免数据出现空值、0等场景中也非常常用,可以满足sql中where的功能

这里首先也是要定义一个函数,该函数给定数据行 返回布尔值 实际效果是将返回为true的数据保留

  1. Function<String, Boolean> boolFilter = new Function<String, Boolean>() {//String是某一行的输入类型 Boolean是对应的输出类型 用于判断数据是否保留
  2. @Override
  3. public Boolean call(String row) throws Exception {//重写call方法
  4. boolean flag = row!=null;
  5. return flag;
  6. }
  7. };

  通常该函数实际使用中需要修改的仅仅是row的类型 也就是数据行的输入类型,和上面的转换函数不同,此call方法的返回值应是固定为Boolean

然后是调用方式

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

  

三、mapToPair

该方法和map方法有一些类似,也是对数据进行一些转换。不过此函数输入一行 输出的是一个元组,最常用的方法是用来做交叉验证 或者统计错误率 召回率 计算AUC等等

同样,需要先定义一个转换函数

  1. Function<String, Boolean> transformer = new PairFunction<LabeledPoint, Object, Object>() {//LabeledPoint是输入类型 后面的两个Object不要改动
  2. @Override
  3. public Tuple2 call(LabeledPoint row) throws Exception {//重写call方法 通常只改动输入参数 输出不要改动
  4. double predicton = thismodel.predict(row.features());
  5. double label = row.label();
  6. return new Tuple2(predicton, label);
  7. }
  8. });

  关于调用的类、类的对象,要求和之前的一致,类需要实现序列化,类的对象需要声明成final类型

相应的调用如下:

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

  然后对该predictionsAndLabels的使用,计算准确率、召回率、精准率、AUC,接下来的博客中会有,敬请期待

如有补充,或者质疑,或者有相关问题,请发邮件给我,或者直接回复  邮箱:326543991@qq.com

 

java-spark的各种常用算子的写法的更多相关文章

  1. Spark中的常用算子

    更多有用的例子和算子讲解参见: http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html map是对每个元素操作, ma ...

  2. Spark学习之常用算子介绍

    1. reduceByKey reduceByKey的作用对像是(key, value)形式的rdd,而reduce有减少.压缩之意,reduceByKey的作用就是对相同key的数据进行处理,最终每 ...

  3. java实现spark常用算子之Reduce

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  4. java实现spark常用算子之groupbykey

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spa ...

  5. spark常用算子总结

    算子分为value-transform, key-value-transform, action三种.f是输入给算子的函数,比如lambda x: x**2 常用算子: keys: 取pair rdd ...

  6. spark学习(10)-RDD的介绍和常用算子

    RDD(弹性分布式数据集,里面并不存储真正要计算的数据,你对RDD的操作,他会在Driver端转换成Task,下发到Executor计算分散在多台集群上的数据) RDD是一个代理,你对代理进行操作,他 ...

  7. Spark—RDD编程常用转换算子代码实例

    Spark-RDD编程常用转换算子代码实例 Spark rdd 常用 Transformation 实例: 1.def map[U: ClassTag](f: T => U): RDD[U]  ...

  8. RDD(弹性分布式数据集)及常用算子

    RDD(弹性分布式数据集)及常用算子 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据 处理模型.代码中是一个抽象类,它代表一个 ...

  9. SparkRDD简介/常用算子/依赖/缓存

    SparkRDD简介/常用算子/依赖/缓存 RDD简介 RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区. ...

随机推荐

  1. angular based app开发流程

    整理user story mock UI,生成满足上述user story的原型界面 根据上述UI,整理出data model(适用于后端和angular的数据模型) 后端CRUD开发,形成REST ...

  2. 连接到 Azure 上的 SQL Server 虚拟机(经典部署)

    概述 本主题介绍如何连接到运行于 Azure 虚拟机的 SQL Server 实例. 它介绍了一些常规连接方案,并提供了在 Azure VM 中配置 SQL Server 连接的详细步骤. Impor ...

  3. Python 解决写入csv中间隔一行空行问题

    转载解决写入csv中间隔一行空行问题 写入csv: with open(birth_weight_file,'w') as f: writer=csv.writer(f) writer.writero ...

  4. Excel英语成绩单 吴昊

  5. ASP.NET Core 编码、web编码、网页编码 System.Text.Encodings.Web

    System.Text.Encodings.Web 空间包含表示 Web 编码器的基类.表示 HTML.JavaScript 和 Url 字符编码的子类,以及表示仅允许编码特定字符.字符范围或码位的筛 ...

  6. August 14th 2017 Week 33rd Monday

    Life is like a watch, you can return to the starting point, they are not yesterday! 人生就像钟表,可以回到起点,却已 ...

  7. php使用<?php include之后页首有空白

    1.今天做这一个页面的时候发现如果使用<?php include包含了一个页面,但是页首始终有一个空白行,度娘出来原来是因为使用了UTF-8格式,应该选择UFT-8无BOM格式的,原来还有这一说 ...

  8. 定义类、System.Object对象、构造函数与析构函数、抽象类与静态类

    一.类定义 class MyClass { //类成员 } 1.访问级别 默认访问级别为internal(内部类),也可以是public(公共类) internal(内部类):当前项目中的代码才能访问 ...

  9. linux setup 相关text mode图形配置工具的安装

    centos 6.4 x86_64 minimal安装后发现setup命令不可用 yum update yum install setup 安装完了还是不可用,不知为什么,难道装的那个包不对?yum ...

  10. 匹配IP的正则表达式

    正则表达式匹配IP 1 ((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[1-9])