数据开发:Spark算子

Action (行动)算子

foreach

foreach 对RDD中的每个元素都应用传入的函数进行操作,
不返回RDD和Array,而是返回Unit

val source:RDD[String] = sc.textFile(".\\datas")
val result_string:RDD[String] = source.map(x=>(x))
// 打印RDD中每个元素
result_string.foreach(println)

count

count 返回整个RDD的元素个数

val con: Long = sc.textFile(".\\datas").flatMap(line => (line.split(" "))).count()

collect

collect 相当于toArray(toArray已经过时不推荐使用),
collect将分布式的RDD返回为一个单机的Scala Array数组,在这个数组上运用Scala的函数式操作。

   val col: Array[String] = sc.textFile(".\\datas")
     .flatMap(line => line.split(" ")).collect()

   for (i <- col) {
     println(i)
   }

top

top从按降序排列的RDD中获取前几个元素,
比如top(5)表示获取前5个元素。

    val col: Array[String] = sc.textFile(".\\datas\\1.txt")
      .flatMap(line => line.split(" ")).top(3)
    for (i <- col) {
      println(i)
    }

reduce

reduce 将RDD中的元素两两传递给输入函数,同时产生一个新的值,
新产生的值与RDD中下一个元素再被传递给输入函数,直到最后只有一个值为止。

个人理解:
将第一个命名为x,将第二个命名为y,第三个命名为z,
假设传递的函数为 x+y,
计算过程为 x+y=c,c+z=【reduce的返回值】

    val col: String = sc.textFile(".\\datas\\1.txt")
      .flatMap(line => line.split(" ")).reduce((x, y) => x + y)
    println(col)

saveAsTextFile

saveAsTextFile 将数据输出存储到HDFS的指定目录

  sc.textFile(".\\datas\\1.txt").saveAsTextFile(".\\datas\\2.txt")

Transformation(变换/转换)算子

map

返回一个新的 RDD,该 RDD 由每一个输入元素经过 func 函数转换后组成

val source:RDD[String] = sc.textFile(".\\datas")
val result_string:RDD[String] = source.map(x=>(x))
result_string.foreach(println)
val result_map:RDD[(String, Int)] = source.map(x=>(x, 1))
result_string.foreach(println)
sc.stop()

flatMap

类似于 map ,但是每个输入元素可以被映射为 0 或多个输出元素(返回一个序列)

个人理解:执行map之后,将每一个item 再map一次,将结果输出为一列

val arr=sc.parallelize(Array(("A",1),("B",2),("C",3)))
arr.flatmap(x=>(x._1+x._2)).foreach(println)

distinct

distinct将RDD中的元素进行去重操作

    sc
      // 读取classpath 下 datas\\1.txt
      .textFile(".\\datas\\1.txt")
      // 将每一个元素 按 " " 空格拆分并且压缩成一列
      .flatMap(line => line.split(" "))
      // 去重
      .distinct().foreach(println)

filter

filter 的功能是对元素进行过滤,对每一个元素应用传入的函数,
返回值为true的元素在RDD中保留;
返回值为false的将过滤掉。

    sc
      // 读取classpath 下 datas\\1.txt
      .textFile(".\\datas\\1.txt")
      // 将每一个元素 按 " " 空格拆分并且压缩成一列
      .flatMap(line => line.split(" "))
      // 去重
      .distinct()
      // 过滤 留下包含"Hello"的元素
      .filter(line => line.contains("Hello"))
      .foreach(println)

reduceByKey

reduceByKey就是对元素为 (K,V)的RDD中Key相同元素的Value进行聚合,
因此Key相同的多个元素的值被聚合为一个值,然后与原RDD中的Key组成一个新的(K,V)。

    sc
      // 读取classpath 下 datas\\1.txt
      .textFile(".\\datas\\1.txt")
      // 将每一个元素 按 " " 空格拆分并且压缩成一列
      .flatMap(line => line.split(" "))
      // 每个元素换为(Hello,1),……(Spark,1)
      .map(line=> (line, 1))
      // reduceByKey会寻找相同key的数据,当找到这样的两条记录时会对其value(分别记为x,y)
      // 做(x,y) => x+y的处理,即只保留求和之后的数据作为value。
      // 反复执行这个操作直至每个key只留下一条记录。
      .reduceByKey((k,v) => k+ v)
      .foreach(println)

union

union 可以对两个RDD进行合并,
但并不对两个RDD中的数据进行去重操作,它会保存所有数据;
另外union做合并时要求两个RDD的数据类型必须相同

// 合并后打印
helloLines.union(checkLines).foreach(println)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Singing_Towers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值