Spark-Operator-flatmap

note 1
这里只是将我学习初期笔记拿来分享,没有做太多精细的推理验证,如有错误,希望指正。
note 2
整个算子系列应用的测试数据是相同的,在本系列第一篇Spark-Operator-Map中有完整的测试数据
note 3
因为工作环境如此,我个人使用Java+Scala混合开发,请知悉
note 4
代码版本
    -Spark2.2 
    -Scala2.11
  • 源码
  /**
   *  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))
  }

方法解析
- U:ClassTag ClassTag
- TraversableOnce[U] scala collection 下的一个trait :A template trait for collections which can be traversed either once only or one or more times.
- 我翻看了以下collection的源码, Iterable 是继承了这个类的,也就是所有的scala集合类型应该都符合要求,这里用这个特质代表泛型,应该是强调这个collection是可以1次或多次迭代的

源码注释:
- 1.对RDD所有内容执行这个操作
- 然后摊平结果

原本最经典的例子就是 WordCount使用flatMap 计算每个单词的数量,这里我做一个类似的

package basic

import org.apache.spark.sql.SparkSession
import shapeless.ops.nat.GT.>

import scala.collection.immutable.HashSet

/**
  *
  */
object TestFlatMap {
  val ss = SparkSession.builder().master("local").appName("1").getOrCreate()
  val sc = ss.sparkContext
  val rdd = sc.textFile("/home/missingli/IdeaProjects/SparkLearn/src/main/resources/sparkbasic.txt")
  sc.setLogLevel("error")

  def main(args: Array[String]): Unit = {
    rdd.foreach(println)
    val flatrdd = rdd.flatMap(line=>line.split(",",-1))
    // String.split 返回的是个 String[]

    println("------------------")
    flatrdd.foreach(println)
    println("-------------------")

    // 这里定义一个 返回 Set 的函数
    def myfuc(line:String ):Set[String]={
      val list0 = line.split(",",-1)
      var hset = new HashSet[String]
      hset =hset + list0(0)
      hset =hset + list0(1)
      hset
    }
    val flatrdd2 = rdd.flatMap(myfuc)
    flatrdd2.foreach(println)
  }
}

控制台打印结果

1,a,c,b
2,w,gd,h
3,h,r,x
4,6,s,b
5,h,d,o
6,q,w,e
------------------
1
a
c
b
2
w
gd
h
3
h
r
x
4
6
s
b
5
h
d
o
6
q
w
e
-------------------
a
1
2
w
h
3
4
6
5
h
6
q
  • 结论
    • flatmap对于可以对各种Iterator进行-摊平-操作
    • 在处理复杂json的ETL这算是核心功能
    • 实际上WordCount程序可以很清除的说明flatmap的作用,这个测试算是拓宽一下思路
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值