“戏”说Spark-Spark核心-RDD转换操作算子详解(二)
来源:互联网 发布:电陶炉 知乎 编辑:程序博客网 时间:2024/06/05 05:30
“戏”说Spark-Spark核心-RDD转换操作算子详解(二)
算子概述
在“戏”说Spark-Spark核心-RDD转换操作算子详解(一)中,我们结合案例详细的讲解了一些比较常用的算子,现在我们继续了解Spark中提供的丰富的算子,我们讲解下面的这些算子
结合案例讲解算子:
算子演示代码:
package spark.myspark.functions
import org.apache.spark.{SparkContext, SparkConf}
/**
* distinct:去重
* union:合并
* foreachPartition:遍历
* jion:内连接
* leftOuterJion:左外连接
* rightouterJion:右外连接
* fullouterJion:全外连接
*/
object otherTransformationAndAction_test {
def main(args: Array[String]) {
val conf= new SparkConf().setAppName("TransformationAndAction_test").setMaster("local")
val sc =new SparkContext(conf)
//=======================distinct========================================//
//去重distinct:源码就是:map+reduceByKey+map
//SparkContext.parallelize(Array,partitonNum=1):第二个参数默认是1,可以不用设置
val repeatRDD=sc.parallelize(Array("java","scala","js","java","html","js"))
val distinctRDD=repeatRDD.map((_,1)).reduceByKey(_+_).map(_._1)
distinctRDD.foreach(println)
repeatRDD.distinct().foreach(println)
//=======================foreachPartiton====================================//
//foreachPartiton和foreach()数据库连接对比案例代码
distinctRDD.foreach(x=>{
println("创建数据库连接")
println("拼接sql")
println("执行sql")
})
// foreachPartition(Iterator)实现:传入的参数是迭代器,将一个Partition的数据加载到内存中,然后再遍历
// foreach()遍历的基本单位是每一条记录,foreachPartition()遍历的单位是partition,类似的////还有map()和mapPartition()
distinctRDD.foreachPartition(x=>{
println("创建数据库连接")
while(x.hasNext){
println("拼接sql"+x.next())
}
println("执行sql")
})
//===========================jion=======================================//
//jion:内连接
val scoreRDD=sc.parallelize(List(
(1,100),
(2,90),
(3,84),
(4,69)
),2)
//本地集合获取得到RDD:
val subjectRDD=sc.makeRDD(Array(
// (1,"math"),
(2,"english"),
(3,"chinese"),
(4,"physics")
),3)
//测试jion后的分区数:jionedRDD的分区是由父RDD中最多的分区数来决定的
println("Jion后的partition="+subjectRDD.partitions.length)
//jion左边的为主表:主表的数据做为标准连接
val jionRDD=subjectRDD.join(scoreRDD)
jionRDD.foreach(
x=>{
val id=x._1
val subject=x._2._1
val score=x._2._2
println("id:"+id+" subject:"+subject+" score:"+score)
}
)
//leftOuterJoin左边的为主表:主表的数据做为标准连接,没连接上的为none
//rightOuterJoin右边的为主表:主表的数据做为标准连接,没连接上的为none
//fullouterJion全部连接,没连接上的为none
val leftOuterJoinRDD=subjectRDD.leftOuterJoin(scoreRDD)
leftOuterJoinRDD.foreach(
x=>{
val id=x._1
val subject=x._2._1
val score=x._2._2
println("id:"+id+" subject:"+subject+" score:"+score)
}
)
//===========================union=======================================//
//union:union后的分区数是union RDD的累加和
val unionRDD1=sc.parallelize(1 to 10,1)
val unionRDD2=sc.parallelize(1 until 20,2)
val unionRDD=unionRDD1.union(unionRDD2)
println("union后的分区数="+unionRDD.partitions.length)
unionRDD.foreach(println)
}
}
源码下载地址:链接:http://pan.baidu.com/s/1nuTS8WT密码:9bf7
总结:
distinct:
distinct源码解析:
RDD类中:
jion:针对(K,V)的RDD的操作
union:注意:union关联的两个RDD必须类型一致
foreachPartition:foreachPartition()遍历的单位是partition,类似的
jionedRDD的分区是由父RDD中最多的分区数来决定的
如需形象的理解算子请参考博客:
图解算子:http://www.cnblogs.com/liuzhongfeng/p/5285613.html
思维导图构建你的知识架构:
阅读全文
0 0
- “戏”说Spark-Spark核心-RDD转换操作算子详解(二)
- “戏”说Spark-Spark核心-RDD转换操作算子详解(一)
- spark RDD操作算子详解(汇总)
- “戏”说Spark-Spark核心-RDD 持久化机制详解
- spark RDD操作算子详解(应用场景汇总)
- Spark算子:RDD创建操作
- Spark算子:RDD创建操作
- 【spark,rdd,2】RDD基本转换算子
- Spark算子:RDD基本转换操作(5)–mapPartitions、
- Spark算子:RDD键值转换操作(2)–combineByKey、foldByKey
- Spark算子:RDD基本转换操作(mapPartitions、mapPartitionsWithIndex)
- Spark算子:RDD基本转换操作(2)–coalesce、repartition
- Spark算子:RDD基本转换操作(6)–zip、zipPartitions
- Spark算子:RDD键值转换操作(2)–combineByKey、foldByKey
- Spark算子:RDD基本转换操作(5)–mapPartitions、mapPartitionsWithIndex
- Spark算子:RDD键值转换操作(4)–cogroup/join
- Spark算子:RDD基本转换操作(7)–zipWithIndex、zipWithUniqueId
- Spark算子:RDD基本转换操作(6)–zip、zipPartitions
- React 轮播图插件
- 下载Android源码流程(完整版)
- 【PHP自学笔记】第十七章 PHP的字符编码
- java数组打印字母的等腰三角形
- requests模拟登陆(session+url_token)
- “戏”说Spark-Spark核心-RDD转换操作算子详解(二)
- 字符串的输入和输出
- hrbust 2291
- 生活小记61
- 私有云实施中,OpenStack虚拟机管理程序很重要
- HTML5中废弃的标签属性
- Idea 2017 用Maven构建的项目找不到相关依赖包(mybatis.generator红色波浪线)的问题解决
- JavaScript学习(1)
- 蓝桥杯 基础练习 字母图形