spark阶段测试题

1、map和flatMap的区别

RDD.scala中的map和flatMap

package com.grace.updateState

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

object MapAndFlatMap {
  def main(args: Array[String]): Unit = {
    val sc = new SparkContext(new SparkConf().setAppName("map_flatMap_demo").setMaster("local"))
    val arrayRDD =sc.parallelize(Array("a_b","c_d","e_f"))
    arrayRDD.foreach(println) //打印结果1
    //a_b
    //c_d
    //e_f

    arrayRDD.map(string=>{
      string.split("_")
    }).foreach(x=>{
      println(x.mkString(",")) //打印结果2
      //a,b
      //c,d
      //e,f
    })

    arrayRDD.flatMap(string=>{
      string.split("_")
    }).foreach(x=>{
      println(x.mkString(","))//打印结果3
      //a
      //b
      //c
      //d
      //e
      //f
    })
  }
}

对比结果2与结果3,很容易得出结论:

map函数后,RDD的值为 Array(Array("a","b"),Array("c","d"),Array("e","f"))

flatMap函数处理后,RDD的值为 Array("a","b","c","d","e","f") 

即最终可以认为,flatMap(Func)会将其返回的数组全部打散,然后合成到一个数组中,并且对每个数据源进行Func处理

源码

 /**
   * Return a new RDD by applying a function to all elements of this RDD.
   */
  def map[U: ClassTag](f: T => U): RDD[U] = withScope {
    val cleanF = sc.clean(f)
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
  }

  /**
   *  Return a new RDD by first applying a function to all elements of this
   *  RDD, and then flattening the results.
   */
  def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U] = withScope {
    val cleanF = sc.clean(f)
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.flatMap(cleanF))
  }

 DStream.scala中的map和flatMap

源码

  /** Return a new DStream by applying a function to all elements of this DStream. */
  def 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark的Shuffle阶段是指在数据处理过程中,将数据重新分区和排序的过程。它是Spark中非常重要的一个阶段,用于将数据从上一个阶段的任务输出到下一个阶段的任务。 在Shuffle阶段中,有两个主要的操作:shuffle write和shuffle read。 1. Shuffle Write(洗牌写入):在Mapper阶段,上一个阶段的任务将最终结果写入磁盘,并根据分区规则将数据划分到不同的分区文件中。每个分区文件对应一个Reducer任务。 2. Shuffle Read(洗牌读取):在Reducer阶段,下一个阶段的任务从上一个阶段的任务中拉取数据进行合并。这个过程涉及网络传输和数据合并操作。 Shuffle阶段的目的是为了将具有相同key的数据聚合在一起,以便后续的计算可以更高效地进行。它是Spark中性能瓶颈的一个关键点,因为涉及到大量的数据传输和磁盘IO操作。 下面是一个示例代码,演示了Spark中Shuffle阶段的使用: ```python # 创建SparkContext from pyspark import SparkContext sc = SparkContext("local", "Shuffle Example") # 创建RDD data = [1, 2, 3, 4, 5] rdd = sc.parallelize(data) # 在map操作中使用shuffle mapped_rdd = rdd.map(lambda x: (x % 2, x)) # 在reduceByKey操作中使用shuffle reduced_rdd = mapped_rdd.reduceByKey(lambda x, y: x + y) # 打印结果 result = reduced_rdd.collect() for key, value in result: print(key, value) # 关闭SparkContext sc.stop() ``` 这个示例中,我们首先创建了一个包含1到5的RDD。然后,在map操作中,我们使用了shuffle将数据按照奇偶数进行分区。最后,在reduceByKey操作中,我们使用了shuffle将具有相同key的数据进行合并。最终,我们打印了结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值