《SPARK MLLIB机器学习》_黄美灵
spark主要库
- SparkSQL:SQL或Hive查询数据。
- Spark Streaming:流数据实时处理,如web日志。
- MLlib:机器学习库。
- GraphX:图计算库。
- 目前主要学习使用MLlib和SparkSQL。
一、MLlib算法库
1.RDD
- 弹性分布式数据集(Resilient Distributed Dataset)。可以将数据存储在磁盘或内存中,并能空值数据分期。
- 提供map、filter、flatMap等转换操作和count、reduceByKey等统计操作。
1.1创建操作
- 数据集合转换,sc.parallelize方法。接受数据集合与分区两个参数。
- 外部数据读取。sc.textFile方法。接受数据路径和分区两个参数。
1.2转换操作
- map:一对一映射。
val rdd1 = sc.parallelize(1 to 9,3)
val rdd2 = rdd1.map(x => x*2)
rdd2.collect
- filter:过滤。
var rdd3 = rdd1.filter(x =>x>10)
rdd3.collect
- flatMap:一对多映射。
var rdd4 = rdd1.flatMap(x=>x to 20)
- mapPartitions:map变种。
- mapPartitionsWithIndex:与mapPartitions类似,多传入split index
- sample:随机抽样。
- union:数据合并
- intersection:数据交集
- distinct:去重
- groupByKey:数据分组
var rdd1 = sc.parallelize(Array((1,1),(1,2),(2,2),(2,3),(3,3),(3,4)))
rdd1.groupByKey().collect
- reduceByKey:数据分组聚合。对相同key的值进行函数聚合。
rdd1.reduceByKey((x,y)=>x+y).collect
- aggregate:与reduceByKey输入输出都是(k,v),aggregate输出输入可以不同。
rdd0.aggregate(0)(math.max(,),+)
- combineByKey:自定义函数对数据集按key聚合。
def combineByKey[C](
createCombiner: V => C, //当前的值作为参数,可以对其做些附加操作(类型转换)并把它返回(这一步类似于初始化操作)
mergeValue: (C, V) => C,//该函数把元素V合并到之前的元素C(createCombiner)上(这个操作在每个分区内进行)
mergeCombiners: (C, C) => C,//该函数把2个元素C合并(这个操作在不同分区间进行)
partitioner: Partitioner,
mapSideCombine: Boolean = true,
serializer: Serializer = null)
// 示例
val initialScores = Array(("Fred", 88.0), ("Fred", 95.0), ("Fred", 91.0), ("Wilma", 93.0), ("Wilma", 95.0), ("Wilma", 98.0))
val d1 = sc.parallelize(initialScores,3)
type MVType = (Int, Double) //定义一个元组类型(科目计数器,分数)
var d2 = d1.combineByKey(
score => (1, score),//把分数作为参数,并返回了附加的元组类型。以"Fred"为列,当前其分数为88.0 =>(1,88.0),1表示当前科目的计数器,此时只有一个科目
(c1: MVType, newScore) => (c1._1 + 1, c1._2 + newScore),//这里的c1就是createCombiner初始化得到的(1,88.0)。在一个分区内,我们又碰到了"Fred"的一个新的分数91.0。
//当然我们要把之前的科目分数和当前的分数加起来即c1._2 + newScore,然后把科目计算器加1即c1._1 + 1
(c1: MVType, c2: MVType) => (c1._1 + c2._1, c1._2 + c2._2) //"Fred"的分数可能分散在不同的分区中。所有的分区都进行mergeValue后,接下来就是对分区间进行合并了,分区间科目数和科目数相加分数和分数相加就得到了总分和总科目数
)
//d2结果:Array[(String, (Int, Double))] = Array((Wilma,(3,286.0)), (Fred