大数据——Spark

news2024/9/22 7:22:53

1.Spark MLlib概述

MLlib是Spark的机器学习(Machine Learning)库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模。

MLlib由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语和高层的管道API

2.Spark MLlib算法库

3.Spark核心概念RDD 

RDD(Resilient Distributed Datasets) 即弹性分布式数据集,是一个只读的,可分区的分布式数据集。

RDD 默认存储在内存,当内存不足时,溢写到磁盘。

RDD 数据以分区的形式在集群中存储。

RDD 具有血统机制( Lineage ),发生数据丢失时,可快速进行数据恢复。

RDD是Spark对基础数据的抽象。

RDD的生成:从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入创建(如HDFS);从父RDD转换得到新的RDD

RDD的存储:用户可以选择不同的存储级别存储RDD以便重用(11种);RDD默认存储于内存,但当内存不足时,RDD会溢出到磁盘中。

RDD的分区:为减少网络传输代价,和进行分布式计算,需对RDD进行分区。在需要进行分区时会根据每条记录Key进行分区,以此保证两个数据集能高效进行Join操作。

RDD的优点:RDD是只读的,静态的。因此可提供更高的容错能力;可以实现推测式执行。

 

RDD属性

  • RDD是在集群节点上的不可变的、只读的、已分区的集合对象
  • 通过并行转换的方式来创建如(mapfilterjoin 等等)
  • 失败自动重建
  • 可以控制存储级别(内存、磁盘等)来进行重用
  • 必须是可序列化的

RDD特点

  • 分区列表(数据块列表)
  • 计算每个分片的函数(根据父RDD计算出此RDD
  • 对父RDD的依赖列表
  • RDD默认是存储于内存,但当内存不足时,会spilldisk(设置StorageLevel来控制)
  • 每个数据分区的地址(HDFS),key-value数据类型分区器,分区策略和分区数

RDDLineageDependency

Dependency(依赖)

  • Narrow Dependencies(窄依赖)是指父RDD的每个分区最多被一个子RDD的一个分区所用。
  • Wide Dependencies(宽依赖)是指父RDD的每个分区对应一个子RDD的多个分区。

Lineage(血统):

  • 依赖的链条
  • RDD数据集通过Lineage记住了它是如何从其他RDD中演变过来的。

4.RDD的算子

Transformation

  • Transformation是通过转换从一个或多个RDD生成新的RDD,该操作是lazy的,当调用action算子,才发起job
  • 典型算子:mapflatMapfilterreduceByKey等。

Action

  • 当代码调用该类型算子时,立即启动job
  • Action操作是从RDD生成最后的计算结果
  • 典型算子:takecountsaveAsTextFile等。

Transformation:

map算子:

map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDDRDD之间的元素是一对一关系;

filter算子:

Filter是对RDD元素进行过滤;是经过func函数后返回值为true的原元素组成,返回一个新的数据集;

flatMap算子:

flatMap类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素),RDD之间的元素是一对多关系;

mapPartitions算子:

mapPartitions是map的一个变种。map的输入函数是应用于RDD中每个元素,而mapPartitions的输入函数是每个分区的数据,也就是把每个分区中的内容作为整体来处理的。

mapPartitionsWithIndex 算子:

mapPartitionsWithSplit与mapPartitions的功能类似, 只是多传入split index而已,所有func 函数必需是 (Int, Iterator<T>) => Iterator<U> 类型。

sample算子:

sample(withReplacement,fraction,seed)是根据给定的随机种子seed,随机抽样出数量为frac的数据。

withReplacement:是否放回抽样;fraction:比例,seed:0.1表示10%

union算子:

union(otherDataset)是数据合并,由原数据集和otherDataset联合而成,返回一个新的数据集。

intersection算子

intersection(otherDataset)是数据交集,包含两个数据集的交集数据,返回一个新的数据集;

distinct算子

distinct([numTasks]))是数据去重,是对两个数据集去除重复数据,numTasks参数是设置任务并行数量,返回一个数据集。

groupByKey算子

groupByKey([numTasks])是数据分组操作,在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。

reduceByKey算子

reduceByKey(func, [numTasks])是数据分组聚合操作,在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。

aggregateByKey算子

aggregateByKey(zeroValue: U)(seqOp: (U, T)=> U, combOp: (U, U) =>U) reduceByKey的不同在于,reduceByKey输入输出都是(K, V),而aggregateByKey输出是(K,U),可以不同于输入(K, V) aggregateByKey的三个参数:

zeroValue: U,初始值,比如空列表{}

seqOp: (U,T)=> Useq操作符,描述如何将T合并入U,比如如何将item合并到列表 ;

combOp: (U,U) =>U,comb操作符,描述如果合并两个U,比如合并两个列表 ;

所以aggregateByKey可以看成更高抽象的,更灵活的reducegroup

combineByKey算子

combineByKey是对RDD中的数据集按照Key进行聚合操作。聚合操作的逻辑是通过自定义函数提供给combineByKey。

combineByKey[C](createCombiner: (V) ⇒ C, mergeValue: (C, V) ⇒ C, mergeCombiners: (C, C) ⇒ C, numPartitions: Int):RDD[(K, C)](K,V) 类型的RDD转换为(K,C)类型的RDDCV可以不一样。

sortByKey算子

sortByKey([ascending],[numTasks])是排序操作,对(K,V)类型的数据按照K进行排序,其中K需要实现Ordered方法。

join算子

join(otherDataset, [numTasks])是连接操作,将输入数据集(K,V)和另外一个数据集(K,W)进行Join, 得到(K, (V,W));该操作是对于相同KVW集合进行笛卡尔积 操作,也即VW的所有组合。

连接操作除join 外,还有左连接、右连接、全连接操作函数: leftOuterJoinrightOuterJoinfullOuterJoin

cogroup算子

cogroup(otherDataset, [numTasks])是将输入数据集(K, V)和另外一个数据集(K, W)进行cogroup,得到一个格式为(K, Seq[V], Seq[W])的数据集。

cartesian算子

cartesian(otherDataset)是做笛卡尔积:对于数据集TU 进行笛卡尔积操作, 得到(T, U)格式的数据集。

Action:

reduce算子

reduce(func)是对数据集的所有元素执行聚集(func)函数,该函数必须是可交换的。

collect算子

collect是将数据集中的所有元素以一个array的形式返回。

count算子

返回数据集中元素的个数。

takeOrdered算子

takeOrdered(n[ordering])是返回包含随机的n个元素的数组,按照顺序输出。

saveAsTextFile算子

把数据集中的元素写到一个文本文件,Spark会对每个元素调用toString方法来把每个元素存成文本文件的一行。

countByKey算子

对于(K, V)类型的RDD. 返回一个(K, Int)mapIntK的个数。

foreach算子

foreach(func)是对数据集中的每个元素都执行func函数。

Spark环境的搭建:

Spark这里我们用到了java API,搭建的语言我们主要是用到了Scala,下面是Scala语言对Spark环境的搭建,Scala的搭建我会在后续文章讲到

import org.apache.spark.{SparkConf, SparkContext}

object spark {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()   // Spark的配置文件
    conf.setMaster("local")
    conf.setAppName("RDD8.18")    // 上面都是在设置Spark的部署模式,和名字

    val sc = new SparkContext(conf)   // 将Spark的配置文件导入
    
    // RDD算子的创建方法有两种
    // 1 先随便创建,之后将其转换为RDD算子
    val lst = List(1,3,5)
    val rdd1 = sc.parallelize(lst)
    
    // 直接创建RDD算子
    val rdd2 = sc.parallelize(List("hello world","hello Spark","hello linux"))
    
    // 我们可以通过Ctrl键加鼠标左键点击map,我们可以发现其返回值是RDD,因此map属于transformstions算子,count同理,可以看出其返回值类型不是RDD,因此我们可以判断出其是ACtion算子

    val rdd3 = rdd1.map((x:Int) => println("x="+x))
    rdd3.count()

    rdd2.flatMap((word:String)=>{
      val danci = word.split(" ")
      danci
    }).map((_,1)).foreach(println(_))
  }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能奶柜:重塑牛奶零售新篇章

智能奶柜&#xff1a;重塑牛奶零售新篇章 回忆往昔&#xff0c;孩童时代对送奶员每日拜访的期待&#xff0c;那熟悉的一幕——新鲜牛奶被细心放置于家门口的奶箱中&#xff0c;成为了许多人温馨的童年记忆。如今&#xff0c;尽管直接投递袋装牛奶的情景已不多见&#xff0c;但…

Android NDK系列(一)手动搭建Native Project

使用NDK编写的本地代码具有高性能等特性&#xff0c;在游戏、图形处理等领域有广泛应用&#xff0c;下面介绍如何手动搭建一个纯C版的Android项目&#xff0c;通过该项目可以理解Android的项目结构。 一、创建settings.gradle Android项目是基于Gradle构建的&#xff0c;首先得…

推荐系统学习笔记(四)--基于向量的召回

离散特征处理 离散特征&#xff1a;性别&#xff0c;国籍&#xff0c;英文单词&#xff0c;物品id&#xff0c;用户id 处理&#xff1a; 建立字典&#xff1a;eg&#xff1a;china 1 向量化&#xff1a;eg&#xff1a;one-hot /embedding&#xff08;低维稠密向量&#xf…

【Qt QML】Dialog组件

带有标准按钮和标题的弹出对话框&#xff0c;用于与用户进行短期交互。 这个描述指的是一个常见的用户界面元素&#xff0c;即一个临时弹出的窗口&#xff08;或对话框&#xff09;&#xff0c;它包含一个标题&#xff0c;显示对话框的用途或内容描述&#xff0c;以及一系列标…

用手机做客服的吐槽点客服亲们有同感吗

聊天宝手机版很好的解决了&#xff0c;客服手机快速回复客户的需求&#xff0c;不论微信&#xff0c;企业微信&#xff0c;千牛或其他手机APP回复客户&#xff0c;都可以用聊天宝APP实现图文一键发送&#xff0c;非常方便 前言 做客服工作&#xff0c;除了电脑上回复客户咨询&…

开源博客项目Blog .NET Core源码学习(23:App.Hosting项目结构分析-11)

本文学习并分析App.Hosting项目中后台管理页面的标签管理页面、轮播图维护页面。 标签管理页面 标签管理页面用于显示、检索、新建、编辑、删除标签数据&#xff0c;以便在前台页面的首页及文章专栏等页面显示标签数据。标签管理页面附带一新建及编辑页面&#xff0c;以支撑新…

OpenStack与Kubernetes:云计算平台的两大巨头及其差异

目录 一、引言 二、OpenStack概述与特点 三、Kubernetes概述与特点 四、OpenStack与Kubernetes的比较 OpenStack上创建虚拟机的代码案例 Kubernetes上部署应用的代码案例 五、OpenStack与Kubernetes的协同工作 六、结论 一、引言 在数字化转型的时代&#xff0c;云计算…

gitlab push 代码,密码正确,仍然提示HTTP Basic: Access denied. The provided password

HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password gitlab 登录账户密码确认正确&#xff0c;登录获取代码仍然提示以上问题&#xff0c;解决方案 …

揭秘成绩等级背后的逻辑:小明的语文分数转换记

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、成绩等级转换规则 三、小明的语文成绩转换过程 四、总结与展望 一、引言 在…

蓝桥杯备赛——DP续【python】

一、小明的背包2 试题链接&#xff1a;https://www.lanqiao.cn/problems/1175/learning/ 输入示例 5 20 1 6 2 5 3 8 5 15 3 3 输出示例 120 问题分析 这题是完全背包&#xff0c;每个物品有无数个&#xff0c;所以对于任意dp[i][j]&#xff08;其表示的意思为选到第i个…

新手福利:这个模块/工具让你开发的程序轻松实现自动升级功能!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 项目介绍 📒📝 模块功能📝 安装📝 使用⚓️ 相关链接 ⚓️📖 介绍 📖 你是否在开发应用程序时,为如何实现自动软件升级而苦恼?特别是对于 Python 新手开发者来说,编写更新代码可能不是一件容易的事。今天,我将向…

Android 11 触摸小圆点显示流程

在开发者选项中&#xff0c;打开 “显示点按操作反馈” 开关&#xff0c;当我们在触摸屏幕时&#xff0c;会显示一个小圆点&#xff0c;来分析下小圆点的显示流程。 操作这个开关时&#xff0c;其实就是操作Settings数据库中的 SHOW_TOUCHES //packages\apps\Settings\src\com…

HTTP请求拦截器链

文章目录 HTTP请求拦截器链需求定义写一个Controller方法接口写三个http请求拦截器把拦截器加入到配置中&#xff0c;并且配置拦截规则在postman里面发送请求&#xff0c;看下测试结果是否正确 HTTP请求拦截器链 需求定义 我们写一个包含三个HTTP请求拦截器的拦截器链&#x…

如何让UE4.26使用VS2022【Windows,源码下载】

使用UE5一直用的是VS2022&#xff0c;都是因为团队需要&#xff0c;只能用UE4&#xff0c;而我电脑中拥有的UE4的版本是UE4.26以及VS2022&#xff0c;我不可能去下载VS2019来为这么一个项目&#xff0c;所以就研究了一下是哪里阻止了UE4.26不让我使用VS2022. 首先下载UE4.26源码…

Langchain-Chatchat之pdf转markdown格式

文章目录 背景开发环境loader文本解析步骤markdown格式的文本为什么选择markdown格式测试markdown格式提取表格原pdf表格markdown格式的表格 测试markdown格式的知识库运行项目修改文件加载器loader 其他问题运行项目报错查看系统当前的max_user_watches修改sysctl.conf配置 图…

【Linux】Linux下centos更换国内yum源

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;Linux &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 1. 备份旧的 YUM 源文件2. 下载国内的 YUM 源文件阿里云&#xff1a;网易&#xff1a; 3. 清理 YUM 缓存4. 更新…

【c++leetcode】69. Sqrt(x)

问题入口 二分搜索 最困难的是能否意识到用二分搜索法解题。 算术平方根的区间在[1, x] 。代码如下&#xff1a; class Solution { public:int mySqrt(int x) {if (x 1 || x 0){return x;}int64_t start 1;int64_t end x;while (start < x){int64_t mid start (en…

开箱元宇宙| 探索家乐福如何在The Sandbox 中重新定义零售和可持续发展

有没有想过 The Sandbox 如何与世界上最具代表性的品牌和名人的战略保持一致&#xff1f;在本期的 "开箱元宇宙 "系列中&#xff0c;我们与家乐福团队进行了对话&#xff0c;这家法国巨头率先采用web3技术重新定义零售和可持续发展。 家乐福的用户平均游玩时间为 57 …

06_知识点总结(JS高级)

一、进程与线程 1. 进程(process)&#xff1a;程序的一次执行, 它占有一片独有的内存空间 2. 线程(thread)&#xff1a; 是进程内的一个独立执行单元&#xff0c;CPU的基本调度单元, 是程序执行的一个完整流程 3. 进程与线程 * 应用程序必须运行在某个进程的某个线程上 * 一个…

tinyrenderer-渲染器着色

整理了代码&#xff0c;创建了一个相机类&#xff0c;控制镜头 class Camera { public:Camera(Vec3f cameraPos, Vec3f target, Vec3f up):cameraPos_(cameraPos), target_(target), up_(up) {}Matrix getView();Matrix getProjection(); private:Vec3f cameraPos_;Vec3f targ…