RDD算子使用--action行动算子操作

action行动算子操作

1)foreach算子:

foreach主要功能,就是用来遍历RDD中的每一条纪录,其实现就是将map或者flatMap中的返回值变为Unit即可,即foreach(A => Unit)。

2)count算子:统计该rdd中元素的个数。

val count = rdd.count()

println("rdd的count个数为:" + count)

3)collect算子:字面意思就是收集,拉取的意思,该算子的含义就是将分布在集群中的各个partition中的数据拉回到driver中,进行统一的处理;但是这个算子有很大的风险存在,第一,driver内存压力很大,第二数据在网络中大规模的传输,效率很低;所以一般不建议使用,如果非要用,请先执行filter。

val arr = rdd.filter(_._2 > 2).collect()

arr.foreach(println)

4)take&first:返回该rdd中的前N个元素,如果该rdd的数据是有序的,那么take(n)就是TopN;而first是take(n)中比较特殊的一个take(1)。

val arr:Array[(String, Int)] = rdd.take(2)

arr.foreach(println)



val ret:(String, Int) = rdd.first()

println(ret)

5)takeOrdered(n):返回前几个的排序。

val arr:Array[(String, Int)] = rdd.takeOrdered(2)

arr.foreach(println)

6)reduce算子:需要清楚的是,reduce是一个action操作,reduceByKey是一个transformation。reduce对一个rdd执行聚合操作,并返回结果,结果是一个值。

//例子1
val rdd: RDD[Int] = sc.parallelize(1 to 5,2)
//聚合
val result: Int = rdd.reduce(_+_)
//打印输出
println(result)
//例子2
val rdd2 = sc.makeRDD(Array(("a",1),("a",3),("c",3),("d",5)))
//聚合
val result1= rdd2.reduce((x,y)=>(x._1 + y._1,x._2 + y._2))
//打印输出
println(result1)

需要注意一点的是,聚合前后的数据类型保持一致。

7)countByKey算子:统计key出现的次数。

val rdd = sc.parallelize(List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8)),3)
//统计相同key出现的次数
val result: collection.Map[Int, Long] = rdd.countByKey()
//打印输出
println(result)

8)saveAsXxx算子:

//saveAsTextFile

rdd.saveAsTextFile("file:/E:/data/out/")

//saveAsNewAPIHadoopFile

val path = "file:/E:/data/out1"

rr.saveAsNewAPIHadoopFile(path,

classOf[Text],

classOf[IntWritable],

classOf[TextOutputFormat[Text, IntWritable]])

9)foreachPartition算子:foreach写入写入数据库,但是极其不友好。

def saveInfoMySQL2(rdd: RDD[(String, Int)]): Unit = {

rdd.foreach{case (word, count) => {

Class.forName("com.mysql.jdbc.Driver")

val url = "jdbc:mysql://localhost:3306/test"

val connection = DriverManager.getConnection(url, "mark", "sorry")

val sql =

"""

|insert into wordcounts(word, `count`) Values(?, ?)

|""".stripMargin

val ps = connection.prepareStatement(sql)

ps.setString(1, word)

ps.setInt(2, count)

ps.execute()

ps.close()

connection.close()

}}

}

val rdd: RDD[(String, Int)] = sc.parallelize(List(("hadoop",2)))

save(rdd)

高效写入数据库:

def saveInfoMySQLByForeachPartition(rdd: RDD[(String, Int)]): Unit = {

rdd.foreachPartition(partition => {

//这是在partition内部,属于该partition的本地

Class.forName("com.mysql.jdbc.Driver")

val url = "jdbc:mysql://localhost:3306/test"

val connection = DriverManager.getConnection(url, "mark", "sorry")

val sql =

"""

|insert into wordcounts(word, `count`) Values(?, ?)

|""".stripMargin

val ps = connection.prepareStatement(sql)

partition.foreach{case (word, count) => {

ps.setString(1, word)

ps.setInt(2, count)

ps.execute()

}}

ps.close()

connection.close()

})

}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BigData-缑溪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值