package com.lyzx.day34
import org.apache.spark._
class T2 {
/**
* join方法深入理解
* join类似于sql中的inner join会把键完全匹配的项列以(key,(v1,v2))的形式列出来
* leftOuterJoin 类似于SQL中的left outer join 把左表的全部列出来,右表中不匹配的用None表示
* (3,(3,Some(3))),(4,(4,Some(4))),(1,(1,None))
*
* @param sc
*/
def f1(sc:SparkContext): Unit ={
val rdd1 = sc.parallelize(Array(1,2,3,4,5))
val rdd2 = sc.parallelize(Array(4,5,6,7))
val pairRdd1 = rdd1.map(x=>(x,x))
val pairRdd2 = rdd2.map(x=>(x,x))
// pairRdd1.join(pairRdd2)
// .foreach(println)
pairRdd1.leftOuterJoin(pairRdd2)
.foreach(println)
}
/**
* 对于join之前进行co-partition和不进行co-partition的效率测试
* 实测join之前进行co-partition操作的效率高于直接join
* 注意:数据量小的时候情况不一定
* @param sc
*/
def f2(sc:SparkContext): Unit ={
//产生两个RDD
val rdd1 = sc.parallelize(1 to 18,3)
val rdd2 = sc.parallelize(13 to 30,3)
//映射RDD
val pairRdd1 = rdd1.map(x=>(x,x))
val pairRdd2 = rdd2.map(x=>(x,x))
//查看每个分区里的数据,调试时使用
// pairRdd1.mapPartitionsWithIndex((index,itr)=>{
// println("index1="+index)
// while(itr.hasNext){
// print("-"+itr.next())
// }
// println()
// for(v <- itr) yield v
// }).collect()
//
// pairRdd2.mapPartitionsWithIndex((index,itr)=>{
// println("index2="+index)
// while(itr.hasNext){
// print("="+itr.next())
// }
// for(v <- itr) yield v
// }).collect()
val start1 = System.currentTimeMillis()
//直接做join并记录时间
println("start1=