大数据——Spark

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.mzph.cn/news/843934.shtml

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

相关文章

学习Uni-app开发小程序Day20

今天学习了&#xff1a;页面的渐变背景、使用deep修改子组件样式、全屏页面absolute定位布局和fit-content内容宽度、遮罩层状态转换及日期格式化、uni-popup弹窗层制作弹出信息 页面的渐变背景 需要设置页面背景&#xff0c;使用的是多个页面&#xff0c;这样就可以把背景做…

开源自定义表单系统源码 一键生成表单工具 可自由DIY表单模型+二开

分享一款开源自定义表单系统源码&#xff0c;能够实现99%各行业的报名、预约、加盟申请、调查等应用&#xff0c;而且同时多开创建多个表单&#xff0c;支持自定义各种字段模型&#xff0c;市面上需要的表单模型都含了&#xff0c;随便自定义啦&#xff0c;含完整的代码包和详细…

经典文献阅读之--SMERF(通过标清导航地图增强车道感知和拓扑理解)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&#xff0c;并附带200G…

数组-捡石子小游戏

一、题目描述 二、解题思路 刚开始拿到题目的时候在想是不是需要把所有情况枚举出来&#xff0c;其实思考一下能看出规律&#xff1a; 1.如果有1、2、3颗石子&#xff0c;小牛一定可以赢&#xff1b; 2.再来看4颗石子的时候&#xff0c;小牛A可以拿1~3颗&#xff0c;但是无论小…

探索电商ERP平台的功能架构:实现高效运营的关键

在当今数字化时代&#xff0c;电子商务已经成为了商业运营的主流模式之一。为了应对日益激烈的市场竞争&#xff0c;企业需要借助先进的技术工具来提高运营效率和管理能力。在这篇博客中&#xff0c;我们将深入探讨电商ERP平台的功能架构&#xff0c;揭示其如何成为实现高效运营…

JVM学习-字节码指令集(一)

概述 Java字节码对于虚拟机&#xff0c;好像汇编语言对于计算机&#xff0c;属于基本执行指令Java虚拟机的指令由一个字节长度的&#xff0c;代表某种特定操作含义 的数字(称为操作码Opcode)以及跟随其后的零至多个代表此操作所需参数(操作数&#xff0c;Operands)而构成&…

SaaS 应用之权限管理设计

SaaS 应用中常见的权限设计细节 角色权限模型 角色分层 通常有超级管理员、管理员、普通用户等不同层级的角色。 角色继承 上级角色的权限可以继承给下级角色,形成权限的层级关系。 角色权限矩阵 为每个角色明确定义可执行的操作,如查看、编辑、删除等。 角色动态分配 …

【Linux】22. 线程控制

Linux线程控制 POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”打头的 要使用这些函数库&#xff0c;要通过引入头文<pthread.h> 链接这些线程函数库时要使用编译器命令的“-lpthread”选项 线程创建 pthread_cr…

鸿蒙开发接口UI界面:【@ohos.router (页面路由)】

页面路由 说明开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。页面路由需要在页面渲染完…

AI与空间设计的碰撞?

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答9 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

探索python数据可视化的奥秘:打造专业绘图环境

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、搭建专业绘图环境 二、掌握绘图基本原理 三、解锁绘图高级技巧 四、总结与展望 在数据…

Kivy.garden.NavigationDrawer 后续学习

如百词斩部分代码 MRWord\pages\infopage\info.kv <InfoPage>:anim_type: slide_above_simpleid: main_winbox_button_anchor: box_button_anchor.__self__three_labels_box: three_labels_box.__self__box_phonetic: box_phonetic.__self__BoxLayout:BoxLayout:id: ma…

leetcode力扣 300. 最长递增子序列 II

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&#…

JavaScript跨界记:从网页到指尖的移动应用开发之旅【含代码示例】

JavaScript跨界记&#xff1a;从网页到指尖的移动应用开发之旅【含代码示例】 基础概念&#xff1a;JavaScript在移动开发的立足之地React Native&#xff1a;原生的诱惑Ionic&#xff1a;Web的浪漫 代码示例&#xff1a;Hello, Mobile World!React Native 示例Ionic 示例 功能…

比较(一)利用python绘制条形图

比较&#xff08;一&#xff09;利用python绘制条形图 条形图&#xff08;Barplot&#xff09;简介 条形图主要用来比较不同类别间的数据差异&#xff0c;一条轴表示类别&#xff0c;另一条则表示对应的数值度量。 快速绘制 基于seaborn import seaborn as sns import matplo…

banner2.0自定义轮播布局

说明&#xff1a;最近碰到一个需求&#xff0c;让新闻列表实现轮播图的效果&#xff0c;也就是轮播新闻&#xff0c;然后样式必须按照ui设计的样式来弄&#xff0c;之前传统的banner&#xff0c;都是只轮播图片&#xff0c;没想到&#xff0c;这次居然要轮播新闻&#xff0c; 网…

HTML、CSS网页入门

HTML&#xff08;超文本标记语言&#xff09;是一种用于创建网页的标记语言。它由一系列的标签组成&#xff0c;这些标签用来描述网页的结构和内容。HTML通过这些标签来标识文本、图片、链接、表格等元素&#xff0c;从而使浏览器能够正确地渲染和显示网页内容。 HTML的基本工…

MySQL 重启之后无法写入数据了?

数据库交接后因 persist_only 级别的参数设置引发的故障分析。 作者&#xff1a;不吃芫荽&#xff0c;爱可生华东交付服务部 DBA 成员&#xff0c;主要负责 MySQL 故障处理及相关技术支持。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系…

C++的算法:模拟算法

模拟算法是一种基于事物运动变化过程的模型,通过计算机程序来模拟实际系统行为或过程的方法。在C++中,模拟算法常用于解决复杂系统或过程的建模与仿真问题。本文将介绍模拟算法的实现思路及实际应用,并通过具体的实例来展示如何在C++中实现模拟算法。 一、模拟算法的实现思…

CentOS配置DNS

1.打开/etc/resolv.conf文件 sudo vi /etc/resolv.conf2.添加配置 nameserver 114.114.114.1143.保存并关闭文件。 4.为了确保配置生效&#xff0c;重启网络服务或重启系统。例如&#xff1a; 重启网络&#xff1a; sudo systemctl restart network重启系统&#xff1a; …