RDD的一些api的用法

RDD API 分为Actor类型与Transformation类型

Transformation:延迟加载,并不会直接计算结果,而是记住这些应用到基础数据集上的转换动作。只有在要求返回结果给Driver的动作时(也可以说到actor方法),这些转换才会真正运行,这让spark更加有效率地运行

常用的transformation api
map(func),遍历元素通过func函数生成新的元素
filter(func) ,遍历元素通过func函数返回为true的元素
flatMap(func) , 同map,不过通过func函数后生成的是0到多个新元素,func返回的是序列
mapPartitions(func) , 类似于map,但独立地在RDD的每一个分片上运行,因此在类型为T的RDD上运行时,func的函数类型必须是Iterator[T] => Iterator[U]
mapPartitionsWithIndex(func) , 类似于mapPartitions,但func带有一个整数参数表示分片的索引值,因此在类型为T的RDD上运行时,func的函数类型必须是
(Int, Interator[T]) => Iterator[U]
sample(withReplacement, fraction, seed) , 根据fraction指定的比例对数据进行采样,可以选择是否使用随机数进行替换,seed用于指定随机数生成器种子
union(otherDataset) , 对源RDD和参数RDD求并集后返回一个新的RDD
intersection(otherDataset) , 对源RDD和参数RDD求交集后返回一个新的RDD
distinct([numTasks])) , 对源RDD进行去重后返回一个新的RDD
groupByKey([numTasks])  ,在一个(K,V)的RDD上调用,返回一个(K, Iterator[V])的RDD
reduceByKey(func, [numTasks]),在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数,将相同key的值聚合到一起,与groupByKey类似,reduce任务的个数可以通过第二个可选的参数来设置
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) 
sortByKey([ascending], [numTasks]),在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD
sortBy(func,[ascending], [numTasks]),与sortByKey类似,但是更灵活
join(otherDataset, [numTasks]),在类型为(K,V)(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD
cogroup(otherDataset, [numTasks]),在类型为(K,V)(K,W)的RDD上调用,返回一个(K,(Iterable<V>,Iterable<W>))类型的RDD
cartesian(otherDataset),笛卡尔积
pipe(command, [envVars])
coalesce(numPartitions) 
repartition(numPartitions)
repartitionAndSortWithinPartitions(partitioner)

Actor:

常用的actor api
reduce(func)    通过func函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的
collect()   在驱动程序中,以数组的形式返回数据集的所有元素
count() 返回RDD的元素个数
first() 返回RDD的第一个元素(类似于take(1)take(n) 返回一个由数据集的前n个元素组成的数组
takeSample(withReplacement,num, [seed]) 返回一个数组,该数组由从数据集中随机采样的num个元素组成,可以选择是否用随机数替换不足的部分,seed用于指定随机数生成器种子
takeOrdered(n, [ordering])  
saveAsTextFile(path)    将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本
saveAsSequenceFile(path)    将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下,可以使HDFS或者其他Hadoop支持的文件系统。
saveAsObjectFile(path)  
countByKey()    针对(K,V)类型的RDD,返回一个(K,Int)map,表示每一个key对应的元素个数。
foreach(func)   在数据集的每一个元素上,运行函数func进行更新。

其它API

rdd.map(_*2).sortby(x=>x,true) 排序
rdd.groupByKey().mapValue(_.sum)   统计出现次数     将所有数据分区,再统计,有大量IO
rdd.reduceByKey(_+_)    同上效果一样   先分区聚合,再整体聚合  。(这个方法效果好,使用这种)
mappartitions 循环每个分区元素
mappartitionswithIndex  循环每个分区元素,还可以有分区index

rdd.aggregate(0)(_+_,_+_)聚合,给定初始参数0,每个分区相加,聚合相加,前面的参数会进行分区数+1次聚合
rdd.aggregate(0)(math.max(_,_),_+_) 取出每个分区最大数,然后得到他们的和
rdd.aggregateByKey(0)(_+_,_+_) 与reducebykey效果相同,wordcount


checkpoint:设置检查点,重要的数据的检查
sc.setCheckpointDir("") //设置的备份目录,最好设置到hdfs中(避免丢失)
val rdd =sc.textFile("") //设置读取数据返回rdd
rdd.checkpoint 对这rdd设置检查点
rdd.ischeckpointed  返回boolean  查看是否保存到检查点
rdd.count 由于是懒加载,所以调一下count来提交了任务
rdd.ischeckpointed  再次查看是否保存
rdd.getCheckpointFile 检查数据保存到哪里了

repartition ,coalesce 重新分区
val rdd1=sc.parallelize(1 to 10,10) 这会分10个分区
rdd1.partitions.length  检查rdd1的分区数
val rdd2=rdd1.repaartition(2)  将rdd1的数据给rdd2 ,然后rdd2重新分区 2个
val rdd3=rdd1.coalesce(2,flase) 这也同上重新分区2个,第二个参数是-是否shuffle(flase,那么分区数只能变少,true,分区数可以变多)
val rdd4 =rdd1.partitionBy(new HashPartitioner(2)) 里面传的参数是一个分区器,可以自定义

collectAsMap //转化为map
val rdd=sc.parallelize(List(("a",1),("b",2)))
rdd.collectAsMap  //就变成  Map(b->2,a->1)

combineByKey:  传入三个函数,第一个循环出的数,第二个分区聚合,第三个全局聚合
val rdd1=sc.textFile("").flatMap(_.split("")).map((_,1))   //以下是wordcount
val rdd2 =rdd1.combineBykey(x=>x,(a:Int,b:Int)=>a+b,(m:Int,n:Int) =>m+n)  
//以下是combineByKey的第二例子
val rdd4=sc.parallelize(List("dog","cat","mouse","salmon","rabit","wolf","bear","bee"))
val rdd5=sc.parallelize(List(1,2,1,1,4,2,1,1,2,1))
val rdd6=rdd5.zip(rdd4)  这里形成了数字在前的元祖集合
val rdd7=rdd6.combineByKey(List(_),(x:List[String],y:String)=>x:+y,(m:List[String],n:List[String])=>m++n).collect   Array((1,List(dog,cat..)),(2,List(mouse,..)) 也就是将1个和2个的动物分组

countBykey 统计相同key出现的次数
val rdd=sc.parallelize(List(("a",1),("b",2)))
rdd.countByKey
rdd.reduceBykey(_+_) 这个会将值相加
rdd.countbyValue  相同整个元素出现的次数

filteByRange 过滤范围,是按字典序
val rdd=sc.parallelize(List(("a",1),("b",2),("e",3)))
val rdd2=rdd.filterByRange("b","f")

flatMapValues 取出value操作,然后压平
val rdd=sc.parallelize(List(("a","1 2"),("b","3 4")))
val rdd2=rdd.flatValues(_.split(" ")).collect  Array((a,1),(a,2),(b,3),(b,4))

foldByKey  以key来折叠  也可以用来wordcount
Array((3,dog),(4,wolf),(3,cat),(4,bear)) 
rdd.foldByKey("")(_+_) 结果是 Array((4,wollfbear),(3,dogcat))

foreachPartition  每个分区元素遍历 后面的括号里传函数

keyBy  以参数为key生成元祖   
val rdd=sc.parallelize(List("a","ab"))
rdd.keyBy(_.length)   结果Array((1,a),(2,ab))   相当于map(x=>(x.length,x))

keys  map的集合中直接获取key的集合  元祖元素是2个以上不行
values map的集合中获取value的集合   元祖元素是2个以上不行
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是一个 RDD-based API 的简单 Scala 代码示例,展示如何使用 Apache Spark 中的 MLlib 库来训练一个朴素贝叶斯分类器并输出结果: ```scala import org.apache.spark.mllib.classification.{NaiveBayes, NaiveBayesModel} import org.apache.spark.mllib.util.MLUtils import org.apache.spark.{SparkConf, SparkContext} // 创建 SparkConf 和 SparkContext val conf = new SparkConf().setAppName("NaiveBayesExample") val sc = new SparkContext(conf) // 读取数据集 val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt") // 划分数据集为训练集和测试集 val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3), seed = 1234L) // 训练朴素贝叶斯分类器 val model = NaiveBayes.train(trainingData, lambda = 1.0, modelType = "multinomial") // 在测试集上进行预测 val predictions = testData.map { point => val prediction = model.predict(point.features) (prediction, point.label) } // 计算模型准确率 val accuracy = 1.0 * predictions.filter(r => r._1 == r._2).count() / testData.count() println(s"Test set accuracy = $accuracy") // 输出预测结果 predictions.take(10).foreach(println) // 保存模型 model.save(sc, "myModelPath") // 加载模型 val sameModel = NaiveBayesModel.load(sc, "myModelPath") ``` 你可以将你的数据集替换文中的数据集路径,然后运行代码即可得到训练好的模型和预测结果。需要注意的是,在 RDD-based API 中,我们需要显式地调用 `predict` 方法来进行预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值