在Spark实际应用中,会用到很多数值处理方法,我将一些比较常用的方法写在这里,供新手向的学习参考一下。

1.1 读取文件至RDD

var rdd = sc.textFile("文件路径") 
 var rddfromhdfs = sc.textFile("hdfs://hadoop-master-001:9000/hdfs文件路径")

这个当中有很多方法,比较常用的是

//返回一个K,V形式的RDD 
 sequenceFile[K,V] ()

1.2 缓存到内存

缓存是可以随时用的,但是过多的缓存非常消耗内存资源,所以用的时候需要合理设计

//常用的,持久化 
 cache() 
 //不常用的,返回一个List,太占资源,拿来学习用还可以 
 collect() 
 //切断“血统”,避免过度占用资源 
 checkpoint()

1.3 基础转换

没有什么是用基础转换做不了的,如果有那就多用几次。

//把RDD中的元素从一种类型或状态变成另一种,元素个数保持不变 
 map[U] (f:(T)=>U):RDD[U]
//去重,返回一个没有重复元素的RDD 
 distinct():RDD[T]
//合并成一个系列的元素,常用于多个Array或者Seq合并成一个Array或者Seq 
 flapMap[U] (f:(T)=>TraversableOnce[U]):RDD[U]
//同类型RDD合并,并集,元素不去重 
 union(other:RDD[T]):RDD[T]
//同类型RDD比较,交集,元素去重 
 intersection(other:RDD[T]):RDD[T]
//同类型RDD比较,非otherRDD元素集,元素不去重 
 subtract(other:RDD[T]):RDD[T]
//同类型RDD合并,变成K,V形式RDD,要求元素数目相同 
 zip[U] (other:RDD[U]):RDD[(T,U)]
//将元素和索引号组合成键值对 
 zipWithIndex():RDD[(T,Long)]
//值类型转换 
 //是否是某一类型 
 isInstanceOf[T]():Boolean 
 //转换为某一类型 
 asInstanceOf[T]():T
//过滤 
 filter (f:(T)=>T):RDD[T]

1.4 键值转换

键值转换通常针对的是[K,V]组合的RDD进行的操作,在聚合或者处理JSON数据经常会用的到

//修改value 
 mapValues[U] (f: (V)=>U): RDD[(K,U)]//将value拆分成多个,并使用同一个K 
 flatMapValue[U] (f:(V)=>TraversableOnce[U]):RDD[(K,U)]
//折叠处理,一般用于相同K值合并,一般采用累和(0)(_ +_)或者累积(1)( _* _)之类 
 foldByKey(zreoValue:V)(func:(V,V)=>V):RDD[(K,V)]
//聚合,将相同的K合为一个渠道处理,返回RDD 
 groupByKey():RDD[(K,Interable[V])] 
 //聚合,以函数形式处理相同K下的value,返回RDD,是一种简化的聚合 
 reduceByKey(func:(V,V)=>V):RDD[(K,V)] 
 //聚合,与上一个相同,返回值为Map 
 reduceByKeyLocally(func:(V,V)=>V):Map[K,V]
//全外关联,关联不上为空,最多支持三个RDD作为参数同时关联,是底层用法,实际场景用join居多 
 cogroup[W]( other:RDD[(K,W)]):RDD[(K,(Iterable[V], Iterable[W])] 
 //内连接 
 join[W]( other:RDD[(K,W)]):RDD[(K,(V, W)] 
 //全连接 
 fullOuterJoin[W]( other:RDD[(K,W)]):RDD[(K,(Option[V], Option[W])] 
 //左连接 
 leftOuterJoin[W]( other:RDD[(K,W)]):RDD[(K,(Option[V], W)] 
 //右连接 
 rightOuterJoin[W]( other:RDD[(K,W)]):RDD[(K,(V, Option[W]))] 
 //删除与otherRDD中相同Key的元素 
 subtractByKey( other:RDD[(K,W)]):RDD[(K,V)]

1.5 行动操作

//第一个元素,非排序的 
 first() 
 //元素总数 
 count() 
 //元素二元计算 如+ - × ÷ 
 reduce(f: (T,T)=>T) 
 //按下标获取元素,不排序 
 take(num:Int):Array[T] 
 //按降序返回前num个元素 
 top(num:Int):Array[T] 
 //按升序返回前num个元素 
 takeOrdered(num:Int):Array[T] 
 //聚合,给一个初始值,而后累计操作 
 fold(zeroValue:T)(op:(T,T)=>T) 
 //遍历 
 foreach(f:(T)=>Unit):Unit 
 //排序,true为升序,false为降序 
 sordBy[K]( f:(T)=>K, ascending:Bollean=true):RDD[T]//[K,V]操作, 
 //返回某一K下的所有V 
 lookup(key:K):Seq[V] 
 //统计K的数量 
 countByKey:Map[K,Long]

1.6 存储

//保存为文本文件 
 saveAsTextFile(path:String):Unit 
 //保存为SequenceFile文件储存在HDFS上,底层默认调用 
 saveAsSequenceFile(path:String):Unit 
 //保存为序列化的对象 
 saveAsObjectFile(path:String):Unit 
 //保存到新版Hadoop的HDFS上 
 saveAsHadoopFile(path:String):Unit