Spark学习案例(三)

一、学习Spark MLlib库的Vector向量类型

1、要求:
1、spark处理labeled.txt文件
2、RDD[Line] ->RDD[Vector]
3、文件路径D://data/,再此文件夹下创建一个txt文件分别写出:
2.3 3.2 1
1.6 2.3 2
5.1 2.1 1
6.2 7.2 1
3.2 1.2 2
9.2 2.1 1
2、思路:
1、先按空格将数据进行切分
2、转换类型为Double
3、映射为数组
4、循环输出
3、输出结果:
[2.3,3.2,1.0]
[1.6,2.3,2.0]
[5.1,2.1,1.0]
[6.2,7.2,1.0]
[3.2,1.2,2.0]
[9.2,2.1,1.0]
4、代码

package cn.www.vector
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.storage.StorageLevel
object Driver {
  def main(args: Array[String]): Unit = {
   //练习1:通过spark处理labeled.txt
   //RDD[Line] ->RDD[Vector]
   val conf=new SparkConf().setMaster("local").setAppName("labeled")
   val sc=new SparkContext(conf)
   val data=sc.textFile("d://data/labeled.txt", 2)
   //方法一
   val r1=data.map{line =>{
    val arr=line.split(" ")
    val x1=arr(0).toDouble
    val x2=arr(1).toDouble
    val x3=arr(2).toDouble
    Vectors.dense(x1,x2,x3)
     }
   }
  r1.foreach {println}  
   //方法二
   val r2=data.map { line => line.split(" ")
     .map{num =>num.toDouble}}
     .map{arr =>Vectors.dense(arr)}
   r2.foreach {println} 
  }
}

二、学习MLlib的向量标签类型

1、要求:
1、spark处理labeled.txt文件
2、RDD[Line] ->RDD[Vector]
3、文件路径D://data/,再此文件夹下创建一个txt文件分别写出:
2.3 3.2 1
1.6 2.3 2
5.1 2.1 1
6.2 7.2 1
3.2 1.2 2
9.2 2.1 1
2、思路:
1、先按空格将数据进行切分
2、获取因变量转换类型
3、获取自变量数组
4、循环输出
3、输出结果:
[2.3,3.2,1.0]
[1.6,2.3,2.0]
[5.1,2.1,1.0]
[6.2,7.2,1.0]
[3.2,1.2,2.0]
[9.2,2.1,1.0]
4、代码

package cn.www.cache
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object Driver{
  def main(args: Array[String]): Unit = {  
   //方法一
   val conf=new SparkConf().setMaster("local").setAppName("LabeledPoint")
   val sc=new SparkContext(conf)
   val data=sc.textFile("d://data/labeled.txt", 2)
   val r1=data.map { line => {val arr=line.split(" ")
     val Y=arr.last.toDouble
     val x1=arr(0).toDouble
     val x2=arr(1).toDouble
     LabeledPoint(Y,Vectors.dense(x1,x2))
    }
   }
   r1.foreach {println}
   //方法二
   val r2=data.map { line => {
     val arr=line.split(" ")
     //获取因变量
     val Y=arr.last.toDouble
     //获取自变量数组
     val xArr=arr.dropRight(1).map{num =>num.toDouble}
     LabeledPoint(Y,Vectors.dense(xArr))
    }
   }
    r2.foreach {println}  
  }
}

三、学习MLlib提供的统计工具类

1、要求:
1、创建List(1,2,3,4,5)
2、调用方法输出
2、思路:
1、先将List转化映射
2、使用Statistics
3、输出相应值
3、输出结果:
[5.0]
[1.0]
[3.0]
[2.5]
5
[5.0]
[15.0]
[7.416198487095663]
4、代码

package cn.www.vector
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.stat.Statistics
object Driver{
  def main(args: Array[String]): Unit = {
   val conf=new SparkConf().setMaster("local").setAppName("statistic")
   val sc=new SparkContext(conf)
   val r1=sc.parallelize(List(1,2,3,4,5))
   val r2=r1.map{num =>Vectors.dense(num)}
   val result=Statistics.colStats(r2)
    println(result.max)//最大值
    println(result.min)//最小值
    println(result.mean)//均值
    println(result.variance)//方差
    println(result.count)//数据集个数
    println(result.numNonzeros)//返回数据集中不为0的个数
    println(result.normL1)//计算曼哈顿距离
    println(result.normL2)//计算欧式距离
  }
}

四、距离度量:切比雪夫距离、曼哈顿距离、欧式距离

1、要求:
1、创建Array
2、调用方法输出
2、思路:
1、见注释
3、输出相应值
3、输出结果:
4
7
5.0
4、代码

package cn.www.vector
object Driver{
  def main(args: Array[String]): Unit = {
    val p1=Array(1,3)
    val p2=Array(4,7)
    //练习1:计算两点间的切比雪夫距离
    //提示:Math.abs()取绝对值
    //拉链:将对应的数值对应存放
    val p1p2= p1 zip p2
    val dis1=p1p2.map{x=>Math.abs(x._1-x._2)}.max
    println(dis1)
    //练习2:计算连点之间的曼哈顿距离
    val dis2=p1p2.map{x=>Math.abs(x._1-x._2)}.sum
    println(dis2) 
    //练习3:计算两点之间的欧式距离
    //提示:Math.sqrt()开平方
     val dis3=Math.sqrt(p1p2.map{x=>(x._1-x._2)*(x._1-x._2)}.sum)
    println(dis3)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值