Value型Transformation
***************************************************************
1、集合中创建RDD,Spark主要提供了两中函数:parallelize和makeRDD
2、下划线 '_' 代表集合中所有值
3、map、filter为Transformation算子
4、parallelize(1 to 10,6),位产生1到10的集合,且分六个区
5、toDebugString查看一下RDD依赖关系
6、cache()加入缓存,unpersist()清除缓存
7、foreach(line=>println(line))查看每一行结果
***************************************************************
val num=sc.parallelize(1 to 10)
val doublenum = num.map(_*2)
val threenum = doublenum.filter(_ % 3 == 0)
threenum.collect
threenum.toDebugString
val num1=sc.parallelize(1 to 10,6)
val doublenum1 = num1.map(_*2)
val threenum1 = doublenum1.filter(_ % 3 == 0)
threenum1.collect
threenum1.toDebugString
threenum.cache()
val fournum = threenum.map(x=>x*x)
fournum.collect
fournum.toDebugString
threenum.unpersist()
num.reduce(_ + _)
num.take(5)
num.first
num.count
num.take(5).foreach(println)
需求例子:
1、生成1到20的集合,获取小于5的数值,且每一个值加上2,最后相加得出结果18
scala> val num=sc.parallelize(1 to 20)
scala> num.filter(_<5).map(_+2).reduce(_ + _)
res27: Int = 18
Key-Value型Transformation
***************************************************************
1、注意sortByKey的小括号不能省
2、foreach(line=>println(line))查看每一行结果
3、reduceByKey就是mapreduce中的分组求和
4、union两个rdd进行合并,collect将RDD转换成list或者Map。结果以List或者HashMap的方式输出
5、flatMap将RDD的每个集合中的元素合并成一个集合
***************************************************************
val kv1=sc.parallelize(List(("A",1),("B",2),("C",3),("A",4),("B",5)))
kv1.sortByKey().collect
kv1.groupByKey().collect
kv1.reduceByKey(_+_).collect
val kv2=sc.parallelize(List(("A",4),("A",4),("C",3),("A",4),("B",5)))
kv2.distinct.collect
kv1.union(kv2).collect
val kv3=sc.parallelize(List(("A",10),("B",20),("D",30)))
kv1.join(kv3).collect
kv1.cogroup(kv3).collect
val kv4=sc.parallelize(List(List(1,2),List(3,4)))
kv4.flatMap(x=>x.map(_+1)).collect
***************************************************************
[root@spark-master yuhui]# cat test.txt
a b c d e
a b c d
a b c
1 2 3 4 5
1 2 3 4
1 2 3
***************************************************************
val rdd1 = sc.textFile("hdfs://hadoop14:9000/user/yuhui/rdddata/test.txt")
rdd1.toDebugString
val words=rdd1.flatMap(_.split(" "))
val wordscount=words.map(x=>(x,1)).reduceByKey(_+_)
wordscount.collect
wordscount.toDebugString
val rdd2 = sc.textFile("hdfs://hadoop14:9000/user/yuhui/rdddata/*.txt")
rdd2.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_).collect
val rdd3 = sc.textFile("hdfs://hadoop14:9000/user/yuhui/rdddata/test.txt.gz")
rdd3.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_).collect
日志处理演示
***************************************************************
搜索结果排名第1,但是点击次序排在第2的数据有多少?
***************************************************************
val rdd1 = sc.textFile("hdfs://hadoop14:9000/user/yuhui/rdddata/SogouQ1.txt")
val rdd2=rdd1.map(_.split("\t")).filter(_.length==6)
rdd2.count()
val rdd3=rdd2.filter(_(3).toInt==1).filter(_(4).toInt==2)
rdd3.count()
rdd3.toDebugString
session查询次数排行榜
val rdd4=rdd2.map(x=>(x(1),1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
rdd4.toDebugString
rdd4.saveAsTextFile("hdfs://hadoop14:9000/user/yuhui/output1")
***************************************************************
rdd加cache()和不加cache()
***************************************************************
val rdd5 = sc.textFile("hdfs://hadoop14:9000/user/yuhui/rdddata/SogouQ1.txt")
rdd5.cache()
rdd5.map(_.split("\t")).filter(_.length==6).filter(_(3).toInt==1).filter(_(4).toInt==2).count() //比较时间
val format = new java.text.SimpleDateFormat("yyyy-MM-dd")
case class Register (d: java.util.Date, uuid: String, cust_id: String, lat: Float,lng: Float)
case class Click (d: java.util.Date, uuid: String, landing_page: Int)
val reg = sc.textFile("hdfs://hadoop14:9000/user/yuhui/rdddata/reg.tsv").map(_.split("\t")).map(r => (r(1), Register(format.parse(r(0)), r(1), r(2), r(3).toFloat, r(4).toFloat)))
val clk = sc.textFile("hdfs://hadoop14:9000/user/yuhui/rdddata/clk.tsv").map(_.split("\t")).map(c => (c(1), Click(format.parse(c(0)), c(1), c(2).trim.toInt)))
reg.join(clk).take(2)