优化代码逻辑之 K-近邻算法之鸢尾花实例 使用Spark实现KNN的Demo2

2023-11-03

这篇代码是KNN的优化,代码就是

flatMap里面的结构转换
和aggregate的应用感觉有点难理解
但是思想简单

首先要知道这个优化是基于 有个大数据的思想:分而治之

求出一份数据最大的前一百个数 如果数据太多,内存太小,则将数据切割成多份
每份求出前一百 然后这多份的前一百再求出真正的前一百
TODO 优化的地方
使用 广播变量进行广播

2、没有跟上一个代码一样嵌套两层循环 比如y在外面 x在里面

 y  {
  x  {
    结果:(x, y)
  }
 }

不是像上面那样了 而是成了 Array[(String, (Double, String))] 这样的格式

这次是y的RDD在外面 x这个array在里面了 它的所有位置点在里面进行匹配
Array[(x1, (dis, y.label))] 即每个未知点与当前flatMap里面的已知点的距离和已知点的标签 组成的数组
注意使用了flatMap 所以将数组去掉了 在RDD里面是一个个的[(String, (Double, String))]
这样就得到了想要的 所有的未知点与已知点两两匹配得到的每一条数据

2、有着多个数组的RDD进行aggregateByKey 这个key就是未知点 ok这就是分组了 然后再进行计算

  • 有着多个数组的RDD进行aggregateByKey有两个括号3个参数, 这都是对value的操作 即(Double, String)
    就是指距离和标签 先是初始值 然后是分区内的计算 然后是分区间的计算
    初始值:不可变的TreeSet,TreeSet可以自动排序但缺点是不能存重复值,这里先忽略

(Double, String) 将距离放在前边的原因是要安装key距离排序 这样调换一下就不用手动写排序实现类了

不可变是为了线程安全 不可变是指对象不可变
分区内2个参数(buffer, value: (Double, String))先是buffer初始数组
然后是每一条数据的value值 简单每条都加进buffer即可

因为放进TreeSet的都是自动排好序的 所以始终拿前K个数据 这样不用携带大量数据 省存储还排序快

分区间也是2个参数 (buffer1, buffer2) 这样就是两个buffer相加合在一起了,还是一直保持只取前K个
正好TreeSet默认是升序 我们需要的也是距离未知点最近的 ok

这样得出的结果就是每个未知点与距离最近的前9个已知点的distance和label
就是这样似的RDD[(String, TreeSet[(Double, String)])]

然后value就不需要distance了,map一下,做9个label的WordCount即可 然后取出最多的label
即为KNN推测结果

package IrisKNN.teacher
import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.immutable
import scala.collection.immutable.TreeSet

/**
 * Created by Shi shuai RollerQing on 2019/12/30 19:26
 */
object KNNDemo2 {


  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setMaster("local[*]")
      .setAppName(this.getClass.getCanonicalName)
    val sc = new SparkContext(conf)
    val K: Int = 9
    val data: RDD[String] = sc.textFile("C:\\Users\\HP\\IdeaProjects\\sparkCore\\data\\iris.dat")
    val dataRDD: RDD[LabeledPoint] = data.map(line => {
      val arr: Array[String] = line.split(",")
      if (arr.length == 5) LabeledPoint(arr.last, arr.init.map(_.toDouble))
      else LabeledPoint("", arr.map(_.toDouble))
    })
    val sampleRDD: RDD[LabeledPoint] = dataRDD.filter(_.label != "")
    val testData: Array[Array[Double]] = dataRDD.filter(_.label == "").map(_.point).collect()
    val testDataBC: Broadcast[Array[Array[Double]]] = sc.broadcast(testData)

    val unKnownAndDisAndLabelRDD: RDD[(String, (Double, String))] = sampleRDD.flatMap { rddPoint =>
      val points: Array[Array[Double]] = testDataBC.value
      // map后的point也是array 所以需要换成String
      //然后注意将dis放在前边 label放在后面 方便后续TreeSet根据dis排序
      val unKnownAndDisAndLabel: Array[(String, (Double, String))] = points.map(point => (point.mkString(","), (getDistance(point, rddPoint.point), rddPoint.label)))
      unKnownAndDisAndLabel
    }
    val LabeledRDD: RDD[(String, TreeSet[(Double, String)])] = unKnownAndDisAndLabelRDD.aggregateByKey(immutable.TreeSet[(Double, String)]())(
      (buffer, value: (Double, String)) => {
        val newBuffer = buffer + value
        newBuffer.take(K)
      },
      (buffer1, buffer2) => (buffer1 ++ buffer2).take(K)
    )
    LabeledRDD.map{case (key, buffer) =>
      val labelSorted: List[String] = buffer.toList.map(_._2).groupBy(x => x).mapValues(_.length).toList.sortBy(_._2).reverse.take(1).map(_._1)
      (key, labelSorted.toString())
    }.foreach(println)

    sc.stop()
  }

  def getDistance(x: Array[Double], y: Array[Double]) = {
    import scala.math._
    sqrt(x.zip(y).map(t => pow(t._1 - t._2, 2.0)).sum)
  }
}

这么写不知道为什么错了。。。我认为是两个
在这里插入图片描述

结果没有错误 但是原来的顺序都乱了 可以在getDistance那个地方 不倒换dis和label的位置 然后实现TreeSet的一个自定义排序 本代码就不改了 就是加个实现类的事 写在下一篇的Demo里面吧
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化代码逻辑之 K-近邻算法之鸢尾花实例 使用Spark实现KNN的Demo2 的相关文章

  • Spark集群安装部署

    目录 一 环境准备 二 安装步骤 三 使用Standalone模式 四 使用Yarn模式 一 环境准备 由于Spark仅仅是一种计算机框架 不负责数据的存储和管理 因此 通常都会将Spark和Hadoop进行统一部署 由Hadoop中的HD
  • Spark性能调优之Shuffle调优

    Spark性能调优之Shuffle调优 Spark底层shuffle的传输方式是使用netty传输 netty在进行网络传输的过程会申请堆外内存 netty是零拷贝 所以使用了堆外内存 shuffle过程中常出现的问题 常见问题一 redu
  • 【pyspark】DataFrame基础操作(二)

    介绍一下 pyspark 的 DataFrame 基础操作 一 选择和访问数据 PySpark DataFrame 是惰性计算的 简单地选择一列不会触发计算 但它会返回一个 Column 实例 并且 大多数按列操作都返回 Column 实例
  • Hudi 0.12.0 搭建——集成 Hive3.1 与 Spark3.2

    Hudi 搭建 https blog csdn net weixin 46389691 article details 128276527 环境准备 一 安装 Maven 1 解压 2 配置环境变量 3 修改 Maven 下载源 二 安装
  • 重新定义分析 - EventBridge 实时事件分析平台发布

    对于日志分析大家可能并不陌生 在分布式计算 大数据处理和 Spark 等开源分析框架的支持下 每天可以对潜在的数百万日志进行分析 事件分析则和日志分析是两个完全不同的领域 事件分析对实时性的要求更高 需要磨平事件领域中从半结构化到结构化的消
  • scala和spark的下载与安装

    简易安装scala和spark 一 安装scala 1 安装scala scala下载注意和jdk的版本号 下载地址 https www scala lang org download 2 上传到linux虚拟机里 可通过rz方式上传 上传
  • 学习大数据spark——心得体会

    总结与体会 1 项目总结 本次项目实现了Spark 单机模式Python版的安装 介绍了与Spark编程有关的一些基本概念 特别对RDD的创建 转换和行动操作做了比较详细的说明 对从RDD 到DataFrame的实现进 行了案例训练 包括
  • 深入理解 SQL 中的 Grouping Sets 语句

    前言 SQL 中 Group By 语句大家都很熟悉 根据指定的规则对数据进行分组 常常和聚合函数一起使用 比如 考虑有表 dealer 表中数据如下 id Int city String car model String quantity
  • 浅谈Hadoop体系和MPP体系

    浅谈Hadoop体系和MPP体系 引言 如题 在大数据发展至今 为了应对日益繁多的数据分析处理 和解决客户各种奇思妙 怪 想需求 形形色色的大数据处理的框架和对应的数据存储手段层出不穷 有老当益壮的Hadoop体系 依靠Hadoop巨大的社
  • 【Apache Spark 】第 1 章Apache Spark 简介:统一分析引擎

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • spark算子执行位置研究,driver端?executor端?

    参考资料 https cloud tencent com developer article 1545723 前言 spark算子的执行位置 driver端 还是executor端 这些之前其实没有注意过 最近在学流处理 发现这个还是很重要
  • spark报Got an error when resolving hostNames. Falling back to /default-rack for all

    一 报错代码如下 21 06 01 20 13 36 INFO yarn SparkRackResolver Got an error when resolving hostNames Falling back to default rac
  • 【Spark NLP】第 7 章:分类和回归

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 记一次Spark打包错误:object java.lang.Object in compiler mirror

    使用maven compile和package 一直报错scala reflect internal MissingRequirementError object scala runtime in compiler mirror not f
  • 大数据spark开发入门教程

    大数据是互联网发展的方向 大数据人才是未来的高薪贵族 随着大数据人才的供不应求 大数据人才的薪资待遇也在不断提升 如果你也想进入大数据行业 也想学习大数据技术 大数据讲师认为 可以先从spark技术开始 一 Spark是什么 Spark是一
  • spark_hadoop集群搭建自动化脚本

    bin bash 脚本使用说明 1 使用脚本前需要弄好服务器的基础环境 2 在hadoop的每个节点需要手动创建如下目录 data hdfs tmp 3 修改下面的配置参数 4 脚本执行完备后需要收到格式化namenode
  • 数据中台-让数据用起来-6

    文章目录 第六章 数据开发 数据价值提炼工厂 6 1 数据计算能力的4种类型 6 1 1 批计算 6 1 2 流计算 6 1 3 在线查询 6 1 4 即席分析 6 2 离线开发 1 作业调度 2 基线控制 3 异构存储 4 代码校验 5
  • Spark的常用概念总结

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 基本概念 1 RDD的生成 2 RDD的存储 3 Dependency 4 Transformation和Action 4 1 Transformatio
  • spark hadoop环境及运行

    hadoop配置 在Ubuntu20 04里安装Hadoop详细步骤 图文 亲测成功 ubuntu20 04安装hadoop 菜鸡的学习之路的博客 CSDN博客 启动hadoop root ubuntu usr local hadoop s
  • Spark Sql之dropDuplicates去重

    文章目录 算子介绍 示例 问题 解决 dropDuplicates和distinct 参考 算子介绍 dropDuplicates去重原则 按数据行的顺序保留每行数据出现的第一条 dropDuplicates 在Spark源码里面提供了以下

随机推荐

  • 计算机视觉领域的一些牛人博客

    转载自 blog csdn net carson2005 以下链接是关于计算机视觉 ComputerVision CV 相关领域的网站链接 其中有CV牛人的主页 CV研究小组的主页 CV领域的paper 代码 CV领域的最新动态 国内的应用
  • Linux Select

    文章目录 1 函数原型 1 1 函数参数说明 1 2 返回值 2 相关数据结构与函数 2 1 struct timeval 2 2 fd set 3 编程模型 4 关于select的阻塞 4 select总结 5 Unix5中IO模型 5
  • 服务器不稳定怎么解决?常见的4种问题和6种处理方法

    一 常见的4种问题 1 机房或服务器问题 联系服务器提供商 要求协助排查故障并解决或者更换硬件 2 软件和硬件故障故障问题 要求服务商更换服务器 或者升级服务器 3 网站本身问题 通过优化网站结构 减少垃圾代码等方式来优化网站访问速度 4
  • flutter dart判断文件是否存在

    File txt File data data sms com smsexample files 2 txt var dir bool await txt exists 返回真假 if dirbool
  • css3 flex 实现常见页面布局

    css3 flex 实现常见页面布局 上中下布局 左中右三列布局 圣杯布局 Flex是Flexible Box的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为Flex布局 box display flex 行
  • 云服务器被ddos攻击了怎么办?甜甜来给您解答

    随着互联网科技的发展 网络安全问题日益突出 企业服务器被攻击的事件也越来越频繁 为此快快推出的增值服务高防ip 有效解决了中小企业DDOS攻击问题 同时快快高防ip支持大流量按天付费模式 可按不同业务需求配置弹性防护 成本可控 互联网服务器
  • ansible错误解决:UNREACHABLE Failed to connect to the host via ssh.

    执行过程是 ansible接收动态的hosts与本地的私钥 通过无密码登录方式运行一个playbook 但是运行后始终出现如下问题 PLAY 120 27 26 TASK setup 1 31mfatal 120 27 26 UNREACH
  • Win10系统BitLocker解锁后再次快速锁定办法

    谁都不愿意把自己电脑上资料完全公开 对资料选择性加密处理是唯一的办法 微软Windows7及以后的Windows系统自带磁盘分区BitLocker加密功能是一个不错的选择 BitLocker加密功能的优点之一是可以对磁盘分区进行快速加密 锁
  • jsp不能正常引入jquery($ is not defined)问题分析

    文章目录 1 idea中不能引入jquery step1 step2 2 路径导入问题 3 静态文件不能放在WEB INF下 4 finally jsp中不能正常引入jquery的原因有很多 让我们一步一步来排除 1 idea中不能引入jq
  • 华为面试题: 招聘(javascript)

    题目 某公司组织一场公开招聘活动 假设由于人数和场地的限制 每人每次面试的时长不等 并已经安排给定 用 S1 E1 S2 E2 Sj Ej Si lt Ei 均为非负整数 表示每场面试的开始和结束时间 面试采用一对一的方式 即一名面试官同时
  • 命令行说明中括号的含义

    内的内容表示可写可不写 至少选择大括号内的一个 lt gt 必写项
  • QT删除及创建文件夹

    bool DirMake const QString path QString full path GetFullPath path QDir dir full path if dir exists return true else ret
  • 2022-2023 通信工程专业毕业设计题目选题推荐 - 100例

    文章目录 1前言 2 如何选题 3 通信工程选题方向 2 1 移动通信方向 2 2 嵌入式开发方向 2 3 人工智能方向 2 4 物联网方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 3 4 学长作品展示 4 最
  • 二维码PDF417简介及其解码实现(zxing-cpp)

    二维码PDF417是一种堆叠式二维条码 PDF417条码是由美国SYMBOL公司发明的 PDF Portable Data File 意思是 便携数据文件 组成条码的每一个条码字符由4个条和4个空共17个模块构成 故称为PDF417条码 P
  • 【C#学习笔记】数组使用

    using System namespace ConsoleApplication class Program static void Main string args int a new int 3 一维数组 int a new int
  • 如何通过cpolar内网穿透+VNC实现公网远程ubuntu

    文章目录 前言 1 ubuntu安装VNC 2 设置vnc开机启动 3 windows 安装VNC viewer连接工具 4 内网穿透 4 1 安装cpolar 支持使用一键脚本命令安装 4 2 创建隧道映射 4 3 测试公网远程访问 5
  • 毕业设计-基于协同过滤算法的电商平台推荐系统

    目录 前言 课题背景和意义 实现技术思路 一 文献综述 二 基于用户协同过滤推荐系统算法 三 实证分析 四 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计
  • mysql DATE_FORMAT导致索引失效

    最近在优化一个统计的接口 在几十万的数据统计下 接口处理的响应时间达到了20s 看了下代码逻辑 发现其中主要有三个主要的统计方法 在优化了其中一个方法的统计逻辑后 接口的响应时间下降到了3s内 还是没有达到期望的响应时间 1s内 看了下另外
  • 决策树——依据水果特征分类

    文章目录 一 获取数据集 1 提取数据 2 划分数据 二 计算信息增益 1 信息熵 2 计算信息增益 三 绘制决策树 四 分类预测 一 获取数据集 水果中苹果和杨桃外部特征比较鲜明 例如下面两张苹果 杨桃图片 苹果颜色为红色 形状大致为椭圆
  • 优化代码逻辑之 K-近邻算法之鸢尾花实例 使用Spark实现KNN的Demo2

    这篇代码是KNN的优化 代码就是 flatMap里面的结构转换 和aggregate的应用感觉有点难理解 但是思想简单 首先要知道这个优化是基于 有个大数据的思想 分而治之 求出一份数据最大的前一百个数 如果数据太多 内存太小 则将数据切割