spark介绍及RDD操作

Spark

   Spark的主要部件

        Spark core:包含spark的主要功能。功能跟RDD有关的API都出自spark core

        Spark SQL:spark 中用于结构化数据处理的软件包。用户可以在spark环境下用SQL语言处理数据

        Spark streaming:spark 中用于处理流数据的部件

        MLlib  :spark中用来进行机器学习和数据建模的软件包

        GraphX :spark中用来进行图形计算(如社交媒体关系)的库函数

        ClusterManagers :spark中用来管理集群或者节点的软件平台,这包括hadoop Yarn,Apache Mesos,和standalone scheduler(spark自带的用于单机系统)

Spark core 应用程序包括以下两部分

     Driver

1.     初始化sparkContext(spark的入口)

2.     Executor部分运行完毕后将SparkContext关闭

     Executor

1.     集合数据集

2.     文件数据集

Spark运行模式

       Standalone模式(spark自带的模式)

      1.     Spark-shell  交互式工具提交spark的job时,Driver在Master节点上运行

      2.     Spark-submit 工具提交job时Driver运行在本地client端上

  Yarn-client模式

  Yarn-cluster模式  当用户向YARN中提交一个应用程序后,YARN将分

       两个阶段运行该应用程序

  Mesos模式 另一种开源的Cluster Manager

Spark 调度模式

     Yarn 模式

     NodeManger

RDD类型

     1.     并行集合(Paralleliced Collections)

             来自于分布式化的数据对象比如python中的list对象,比如用户自己输入的数据

     2.      文件系统数据集

             比如hadoop datasets或文本文件,比如通过SparkContext.textFlie()读取的数据

RDD计算方式

    1.     变换(Transformation)

      如:map、filter的返回值仍然是一个RDD,Transformation操作是Lazy的,也就是说变换只是一些指令集而并不会去马上执行,需要等到有Actions操作的时候才会去真正计算给出结果。Lazy Evalustion

   2.     操作(Actions)

     如count,collect,Action操作会返回结果或把RDD数据输出到各类系统中。Action触发spark启动并找到最优的计算途径。返回值是非并行化的数据集合如python中的list

 

编写处理RDD的代码有两类

        1.     Driver 只有一个(普通的python代码)

        2.     Worker(两类算子)

              a)       变换(transformation)懒执行

              b)       行为(Action)立即执行

 

属于变换:map flatMap groupByKey reduceByKey…

属于行为:count take collect countByValue reduce….

RDD的所有操作方法

RDD元素变换                                      RDD元素操作

   map(func)                                               count()

   flatMap(func)                                          reduce()

   filter(func)                                               countByValue()

      连接变换                                               aggregate((0,0),seqOp,combOp)

         union()

         intersection()

         subtract()                  

         cartesian()

 

RDD元素取值操作                                   RDD Key-Value变换

   take(n)                                                         zip(seq1,seq2)

   top(num)                                                      reduceByKey(func)

   first()                                                            groupByKey()

   collect()                                                        mapValue(func)

   foreach(func)                                                sortByKey()

   taleSample()                                                 combineByKey(4个参数)

                                                                          连接变换

RDD Key-Value 操作                                                 join() 内连接

   countByKey()                                                          rightOuterjoin()右链接

   collectAsMap()                                                        leftOuterjoin()左连接

   lookup(key)                                                             cogroup()全连接

   countByKey()                                                           subtractByKey()减连接


详细解释RDD所有操作

RDD元素变换

         map(func)参数是函数,函数应用于RDD每一个元素,返回值是新的RDD

                       

 

          flatMap(func) 参数是函数,函数应用于RDD每一个元素,将元素数据进行拆分,变成迭代器,返回值是新的RDD

                 


                                连接变换

                                  union()        两个RDD的并集(联合)

                                  intersection()  交集

                                 subtract()      差集

                                 cartesian()     笛卡尔

                          

RDD元素操作

       count() 返回RDD里元素数目

                

      reduce(func)并行汇总所有RDD元素

           lambda中接收两个参数

                

   reduce()参数是一个函数,这个函数有两个参数(首先会分区(默认分区数量与虚拟机的核心数有关,我的是2),然后每个分区得出结果最后汇总),两个参数分别是每次分区后两个分区的结果

执行过程:

        分区:[(1,2),(3,4,5)]

        第一次结果:[3,12]

        最后结果:15

 如果是减法的话那分区的分量就显得更明显了,分区的个数不同,那么每次的值都会不一样,后面可以parallelize([1,2,3,4,5],3)这样写说明分成了三个分区,这里有个问题,如果我们只有2个分区,但我们给了三个,计算的时候只会先计算前面2个,算好后再来和第三个一起算。

         countByValue() 各RDD元素在RDD中出现次数

                      

        aggregate((0,0),seqOp,combOp) 将前面的数一直累加

                           

         简单理解(spark操作都是分布式计算,所以都会分区,这里不考虑分区去理解):

             首先理解第一个lambda

              x 程序开始时指代前面的(0,0)初始值,之后是每一次执行后的结果

              y 指代RDD里的每一个元素

              看看执行过程:

                       第一次:0(zoroValue元组的第一个值)+ 1(RDD的第一个元素的值)

                                    0(zoroValue元组的第二个值)+ 1 (固定值,目前我们可以用来表示执行次数)

                                    结果:(1,1) --这个时候 x 的值将是这个

                       第二次:1 + 2(RDD的第二个元素的值),1+ 1

                                    结果:(3,2)

                       第三次:3+ 3(RDD的第三个元素的值),2+ 1

                                    结果:(6,3)

                       第四次:6 + 4(RDD的第四个元素的值),3+1

                                    结果:(10,4)

                       第二个lambda是spark的分区汇总操作

                                  x 指代第一个分区的结果

                                  y 指代第二个分区的结果

      简单描述一下分区:第一个lambda的执行过程并不是上面那样一个区执行的,而是分成两个区去分别执行上述操作,然后通过第二个lambda汇总

RDD元素取值操作

          take(n) 从RDD返回n个元素

          top(num)先从大到小排序,然后从RDD中返回前面的num个数的元素

          first() 从RDD中返回第一个元素

          collect() 从RDD中返回所有的元素(慎用,练习可以用,工作中千万不能用,因为会收集所有的信息,数据量大的会卡死电脑)

                            

           foreach(func)

           taskSample(cithReplacement,num,[seed])


RDD KEY-VALUE变换

        zip(seq1,seq2) 建立KEY-VALUE RDD,在RDD每个配对元素中,第一个被认定为键,第二个认定为值

                   

         reduceByKey(func) 在每一键组内进行汇总变换

                     

         groupByKey() 将值放到每一相同键组内,值是一个迭代器

                     

         mapValues(func) 将每一对RDD键值进行函数func值变换而不改变键

                   

 

         sortByKey() 得到以键排序的RDD

                    


          combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner)

                          

             flatMapValues(func) 用函数产生迭代器并用于RDD每一个键值组对中并产生新的键值对

                 

                               连接变换

                                       join           内连接

                                      rightOuterJoin 右连接 

                                      leftOuterJoin  左连接

                                      cogroup        全连接

                                      subtractByKey  减连接


RDD KEY-VALUE操作

         countByKey() 返回每一键组内的记录数,是个字典

                     

        collectAsMap() 返回一MAP形式的串行化结果

                    

          lookup(key) 返回某键值下的所有值

                   


  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark中的RDD(Resilient Distributed Datasets)是一种分布式的数据结构,它可以被分割成多个分区,每个分区可以在不同的节点上进行计算。RDD提供了一系列的转换和操作函数,可以对RDD进行各种操作RDD转换函数包括map、filter、flatMap、union、distinct、groupByKey、reduceByKey、sortByKey等。这些函数可以对RDD进行转换操作,生成新的RDDRDD操作函数包括count、collect、reduce、take、foreach等。这些函数可以对RDD进行操作,返回结果或者将结果输出到外部系统。 在使用RDD时,需要注意一些问题,如RDD的惰性计算、RDD的持久化、RDD的分区等。同时,还需要根据实际情况选择合适的RDD转换和操作函数,以达到最优的计算效果。 总之,Spark中的RDD转换和操作函数是非常重要的,掌握它们可以帮助我们更好地使用Spark进行分布式计算。 ### 回答2: Spark是一个基于内存计算的分布式计算框架,可以实现大规模数据集的快速处理。在Spark中,RDD(弹性分布式数据集)是数据处理的核心概念,它是一种可以分区、并行计算和容错的不可变数据结构。而Spark中的函数式编程模型则将RDD的转换与操作都看做是函数的调用,从而简洁明了,易于理解和操作。 在Spark中,解决一个具体问题通常涉及一系列RDD的转换和操作RDD的转换包括对原有RDD进行过滤、映射、聚合等处理,得到新的RDD操作则是对新的RDD进行输出、保存、统计、排序等操作。以下介绍几种常见的RDD转换和操作函数。 1. map函数 map函数是一种转换函数,它可以将一个RDD中每个元素通过一个用户定义的函数映射到另一个RDD中,并得到新的RDD。例如,将一个整型RDD中的每个元素都乘以2后得到一个新的整型RDD: ``` val rdd1 = sc.parallelize(Array(1, 2, 3, 4)) val rdd2 = rdd1.map(x => x*2) ``` 2. filter函数 filter函数也是一种转换函数,它可以根据用户定义的条件过滤一个RDD中的元素,并得到一个新的RDD。例如,将一个字符串RDD中长度大于5的元素过滤出来得到一个新的字符串RDD: ``` val rdd1 = sc.parallelize(Array("hello", "world", "spark", "rdd")) val rdd2 = rdd1.filter(x => x.length > 5) ``` 3. reduce函数 reduce函数是一种操作函数,它可以将一个RDD中的元素按照用户定义的函数进行聚合并得到一个结果。例如,将一个整型RDD中的所有元素相加得到一个整数结果: ``` val rdd1 = sc.parallelize(Array(1, 2, 3, 4)) val result = rdd1.reduce((x, y) => x + y) ``` 4. collect函数 collect函数也是一种操作函数,它可以将一个RDD中的所有元素收集起来并输出到Driver端。然而,使用collect函数需要注意RDD的大小,如果RDD很大,就可能会出现内存溢出的情况。例如,将一个整型RDD中的所有元素收集起来并输出到屏幕: ``` val rdd1 = sc.parallelize(Array(1, 2, 3, 4)) val result = rdd1.collect() result.foreach(println) ``` 5. saveAsTextFile函数 saveAsTextFile函数也是一种操作函数,它可以将一个RDD中的所有元素保存到指定的文本文件中。例如,将一个字符串RDD中的所有元素保存到hdfs的一个文本文件中: ``` val rdd1 = sc.parallelize(Array("hello", "world", "spark", "rdd")) rdd1.saveAsTextFile("hdfs://localhost:8020/user/abc/output") ``` 总之,Spark中的RDD转换和操作函数具有弹性、高效、简单等特点,能够满足各种大规模数据处理需求。需要特别注意的是,Spark中的函数式编程模型是基于JVM的,因此要充分利用内存和CPU资源,需要对集群配置和调优进行一定的优化和测试。 ### 回答3: Spark中的RDD(Resilient Distributed Datasets)是分布式的弹性数据集,它可以在大规模集群上并行化地计算,并且提供了一系列的转换和操作函数。其中,Spark提供的Spark函数简单易用,具有高效的数据处理能力,可以帮助开发者快速开发分布式应用程序。 RDD转换函数是将一个RDD转换成另一个RDD的函数,转换后的RDD通常包含了数据处理、筛选和过滤后的新数据集,可以用来接着进行后续的计算。 例如,map函数可以将RDD中的每个元素应用一个函数,然后返回一个新的转换过的RDD: ``` val originalData = sc.parallelize(List(1, 2, 3, 4, 5)) val mappedData = originalData.map(x => x * 2) ``` 这里,map函数将原始数据中的每个元素都乘上了2,返回了一个新的RDD。 除了map函数, 还有flatMap、filter、groupBy等常用的转换函数,都可以帮助我们对RDD做出各种各样的数据处理和转换。 RDD操作函数则是对RDD进行真正的计算操作,例如reduce、count、collect等函数,这些函数会触发Spark的分布式计算引擎执行真正的计算任务。 比如,reduce函数可以将RDD中的所有元素进行聚合,返回一个单一的结果: ``` val originalData = sc.parallelize(List(1, 2, 3, 4, 5)) val reducedData = originalData.reduce(_ + _) ``` 这里,reduce函数将原始数据中的所有元素进行相加操作,返回了一个整数类型的结果。 Spark提供的操作函数非常丰富,从基本的聚合、排序、统计操作,到高级的机器学习和图形处理等操作,开发者可以根据不同的业务需求灵活选择使用。 总之,Spark中的RDD转换和操作函数是分布式数据处理的核心之一,通过这些函数,开发者能够方便地对海量数据进行分布式的计算和处理。同时,Spark也提供了丰富的API和工具,便于开发者进行高效的Spark应用程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值