Spark-Operator-filter

note 1
这里只是将我学习初期笔记拿来分享,没有做太多精细的推理验证,如有错误,希望指正。
note 2
整个算子系列应用的测试数据是相同的,在本系列第一篇Spark-Operator-Map中有完整的测试数据
note 3
因为工作环境如此,我个人使用Java+Scala混合开发,请知悉
note 4
代码版本
    -Spark2.2 
    -Scala2.11
  • 源码
  /**
   * Return a new RDD containing only the elements that satisfy a predicate.
   */
  def filter(f: T => Boolean): RDD[T] = withScope {
    val cleanF = sc.clean(f)
    new MapPartitionsRDD[T, T](
      this,
      (context, pid, iter) => iter.filter(cleanF),
      preservesPartitioning = true)
  }

类似于之前的flatMap,最终做运算的是Iterator底层的方法

Scala Iterator filter

  • 说明

    • 对rdd的每个元素进行筛选,符合条件的保留
    • 接受一个返回 布尔值 的函数作为参数
    • 返回 true保留,false
  • 测试

package basic

import org.apache.spark.sql.SparkSession

/**
  * 
  */
object TestFilter {
  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)

    println("------------------")
    rdd.map(line=>line.split(",",-1)).filter(r=>1==(r(0).toInt%2)).map(_.mkString("_")).foreach(println)
    // 1. 用 , 分隔开 每行
    // 2. 筛选第一个数字未奇数的行
    // 3. 拼成字符串
    // 4. 打印

    // 锻炼一下 scala 
    def oddFilter[T](strA : Array[T]):Boolean={
      val num = strA(0).toString.toInt
      return 1==num%2
    }
    rdd.map(line=>line.split(",",-1)).filter(oddFilter).map(_.mkString("_")).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
3_h_r_x
5_h_d_o
  • 以上,符合预期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值