以下实验源码均使用Scala语言编写。
作业中使用的输入文件可以通过以下网盘地址下载:
https://pan.baidu.com/s/1J8miFmJ6RVZKZqe2O5gAwg
提取码:ethn
输入文件放置在项目根目录下的file文件夹(也可以根据实际情况进行调整)。
大作业一:基于Spark的K近邻(KNN)查询
问题描述:
在空间中共有N个点,每个点由R维向量表示其坐标,对于一个点,KNN指距离其最近的K个点的集合,距离为欧几里得距离。
参数:
K = 20(返回近邻的个数)
R = 4(每个点的坐标维度)
要查询KNN的坐标 (0,0,0,0)
输入文件: KNN-input.txt
i,a,b,c,d (共1000行,每行开始一个整数i,表示点的id,之后4个整数,表示坐标,数据之间以”,”分割)
输出结果:
- 问题1:输出K个整数,为查询的K近邻结果的id,按照距离升序排序(如果距离相等优先输出id靠前的)。
- 问题2:输出1个浮点数,为K近邻距离的平均值
- 问题3:输出1个浮点数,为K近邻距离的方差
题解:
import org.apache.spark.{
SparkConf, SparkContext}
object KNN {
val parameter_K: Int = 20 //KNN中的参数K
val pivot: Array[Int] = Array(0,0,0,0) //要查询KNN的坐标
def main(args: Array[String]): Unit = {
//步骤1:启动spark并读入数据
val sparConf = new SparkConf().setMaster("local").setAppName("KNN")
val sc = new SparkContext(sparConf)
val lines = sc.textFile("file\\KNN-input.txt")
val array = lines.collect()
//步骤2:定义相关函数
//字符串处理,返回(Array[Int], Int)元组
def String_Split(str : String) = {
val arr = str.split(",").map(x_ => x_.toInt)
(