spark rdd详解二(transformation与action操作)

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.spark官网上transformation api

spark transformation的所有操作如下图所示。

这里写图片描述
这里写图片描述
这里写图片描述
图片在页面中看不太清楚,同学们可以右键在新标签页中查看清晰版本。

针对api中常用的一些方法进行说明,以下的代码均在spark-shell中测试通过,spark版本为1.6。

1.map(func)
map无疑是最重要也是最基本的操作了。map将一个rdd的每个数据项通过map中的func映射成一个新的元素。

scala> val mapped = sc.parallelize(1 to 10).map(x => x * 2).collect
mapped: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

2.filter(func)
filter也是一个很常用也很重要的操作。filter返回一个新的数据集,由经过func函数后返回值为true的原元素组成。

scala> val filtered = sc.parallelize(1 to 10).filter( x => x%2 == 0).collect
filtered: Array[Int] = Array(2, 4, 6, 8, 10)

3.flatMap(func)
flatMap类似于map,但是比map多了一个flat动作。每一个输入元素,会被映射为0到多个输出元素。而且func函数的返回值是一个Seq,不能是单一元素。
看两个例子

scala> val flatted = sc.parallelize(Seq("hello world","hello spark","hello hive","hello hadoop")).flatMap(x => x.split(" ")).collect
flatted: Array[String] = Array(hello, world, hello, spark, hello, hive, hello, hadoop)

可以看出,flatMap可以用来切分字段
再来一个例子

scala> val res = sc.parallelize(1 to 3).flatMap(x => 1 to x).collect
res: Array[Int] = Array(1, 1, 2, 1, 2, 3)

对原RDD中的每个元素x产生一共x个元素,元素分别为1到x。

4.distinct([numTasks])
只要是搞数据或者接触过数据库的童鞋们对distinct肯定不陌生,甚至可以说是刻骨铭心,日常工作中最常见的需求就是去重排序了。去重,自然就是distinct做的事情。
distinct返回的是原数据集合中不重复的元素构成的一个新数据集。跟前面的几个方法不一样的地方在于,前面几个方法需要接收一个func的参数,而distinct只有一个可选参数为numTasks。

scala> val rdd = sc.parallelize(Array(1,1,2,2,3,4,5))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[2] at parallelize at <console>:27

scala> val distincted = rdd.distinct.collect
distincted: Array[Int] = Array(1, 2, 3, 4, 5)

5.union(otherDataset)
union在数据库中也是非常常见的操作。在spark中,union操作返回一个新的数据集,新的数据集由原来的数据集与传入的数据集联合产生。

scala> val rdd1 = sc.parallelize(1 to 3)
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[10] at parallelize at <console>:27

scala> val rdd2 = sc.parallelize(1 to 10)
rdd2: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[11] at parallelize at <console>:27

scala> val unioned = rdd1.union(rdd2).collect
unioned: Array[Int] = Array(1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

6.intersection(otherDataset)
与union类似,intersection返回的是两个rdd的交集。

scala> val rdd1 = sc.parallelize(1 to 3)
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[10] at parallelize at <console>:27

scala> val rdd2 = sc.parallelize(1 to 10)
rdd2: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[11] at parallelize at <console>:27

scala> val unioned = rdd1.intersection(rdd2).collect
unioned: Array[Int] = Array(1, 2, 3)

7.reduceByKey(func,[numTasks])
顾名思义,reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行reduce。相同的key对应的多个元素会被reduce为一个值,然后与原来的key组成一个新的kv对。

scala> val rdd = sc.parallelize(List((1,2),(3,4),(3,5)))
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[1] at parallelize at <console>:27

scala> rdd.reduceByKey((x,y) => x+y).collect
res0: Array[(Int, Int)] = Array((1,2), (3,9))

上面的这个例子是对相同的key对应的value做相加的操作,最后返回的是key与对应的value的和。
再来看一个例子

scala> val rdd = sc.parallelize(List((1,2),(3,4),(3,5)))
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[1] at parallelize at <console>:27

scala> rdd.reduceByKey((x,y) => x+y).collect
res0: Array[(Int, Int)] = Array((1,2), (3,9))

这个例子返回的是key与对应的value的最大值

8.groupByKey([numTasks])
这个函数用于将RDD[K,V]中每个K对应的V值,合并到一个集合Iterable[V]。
看个例子就明白了:

scala> val rdd = sc.parallelize(List((1,2),(1,4),(3,4),(3,5)))
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[6] at parallelize at <console>:27

scala> rdd.groupByKey().collect
res3: Array[(Int, Iterable[Int])] = Array((1,CompactBuffer(2, 4)), (3,CompactBuffer(4, 5)))

9.sortByKey([ascending],[numTasks])
这个函数的输入源RDD包含元素类型 (K, V) 对,其中K可排序,则返回新的RDD包含 (K, V) 对,并按照 K 排序,默认为升序。

scala> val rdd = sc.parallelize(List((1,5),(2,4),(4,6),(1,3),(4,5)))
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[24] at parallelize at <console>:27

scala> rdd.sortByKey().collect
res9: Array[(Int, Int)] = Array((1,5), (1,3), (2,4), (4,6), (4,5))

10.join(otherDataset,[numTasks])
join是关系型数据库中最牛逼的操作,没有之一。作为一个牛逼闪闪的数据框架,自然也支持join操作。某一个rdd[k,v]与另外一个rdd[k,w]去join,返回一个rdd[k,(v,w)]。

scala> var rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")))
rdd1: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[31] at makeRDD at <console>:27

scala> var rdd2 = sc.makeRDD(Array(("A","a"),("C","c"),("D","d")))
rdd2: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[32] at makeRDD at <console>:27

scala> rdd1.join(rdd2).collect
res10: Array[(String, (String, String))] = Array((A,(1,a)), (C,(3,c)))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值