Spark部分算子及使用
案例一:flatmap算子
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("test1").setMaster("local[1]")
val sc = new SparkContext(conf)
//UDAF 一对多 炸裂
val list: List[String] = List("wuyanzu,pengyuyan,liushishi,zhangjunning")
val listRDD: RDD[String] = sc.parallelize(list)
//扁平化算子
val flatMapRDD: RDD[String] = listRDD.flatMap(line => line.split(","))
flatMapRDD.foreach(println)
}
案例二:map算子
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("test1").setMaster("local[1]")
val sc = new SparkContext(conf)
//一对一
val list:Seq[Int] = 1 to 7
val listRDD: RDD[Int] = sc.parallelize(list)
//每个元素*7
val mapRDD: RDD[Int] = listRDD.map(e => e * 7)
mapRDD.foreach(println)
}
案例三:filter算子
对父RDD中每一个元素数据执行对应的function函数,如果函数返回true保留当前父RDD中的元素数据,如果为false,过滤掉当前数据
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("test1").setMaster("local[1]")
val sc = new SparkContext(conf)
var list:List[String] = List("1,jiajingwen,18,0","2,pengyuyan,20,1","3,gaoyuanyuan,28,0")
val listRDD: RDD[String] = sc.parallelize(list)
//选出女生
val filterRDD = listRDD.filter(e => {
val strList: Array[String] = e.split(",")
strList(3).equals("0")
})
filterRDD.foreach(println)
}
案例四:sample算子(从父RDD抽取一定量的数据)
数据倾斜调研的时候会用到sample,比如有10TB的数据统计key的个数,会很耗时,可以用抽样,随机抽样用部分的数据代表整体
reducebykey【相同的key拉取到同一节点,不同的key可能拉取到不同节点】
sample(false, 0.2, 1)
1.withReplacement=true:有放回抽样(withReplacement=false无放回抽样)
2.fraction=0.2:不一定就抽取20%,会在20%这个值上下浮动
3.seed=1:随机种子(固定随机模式)
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("test1").setMaster("local[1]")
val sc = new SparkContext(conf)
val list:Seq[Int]= 1 to 10000
val listRDD: RDD[Int] = sc.parallelize(list)
val sampleRDD: RDD[Int] = listRDD.sample(false, 0.2, 1)
sampleRDD.foreach(println