一、学习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)
}
}