Spark RDD API 参考示例(五)

本文参考Zhen He

57、sample

原型 
def sample(withReplacement: Boolean, fraction: Double, seed: Int): RDD[T]

含义 
sample 随机挑选RDD中的一部分产生新的RDD,withReplacement表示是否允许重复挑选,fraction表示挑选比例,seed表示随机初始化种子

示例

val a = sc.parallelize(1 to 20, 3)
//不允许重复挑选,也就是不能有相同的数据
a.sample(false,0.3,0).collect
res1: Array[Int] = Array(3, 10, 13, 15, 16, 19, 20)
//可以重复挑选
a.sample(true,0.3,1).collect
res2: Array[Int] = Array(4, 6, 7, 7, 12, 14)

58、sampleByKey [Pair]

原型 
def sampleByKey(withReplacement: Boolean, fractions: Map[K, Double], seed: Long = Utils.random.nextLong): RDD[(K, V)]

含义 
sampleByKey 先将每一个key相同的聚合在一起,然后在相同的key之间按照指定的权重筛选,用户需要自定义一个Map来确定每个key筛选的比例。

示例

val randRDD = sc.parallelize(List( (7,"cat"), (6, "mouse"),(7, "cup"), (6, "book"), (7, "tv"), (6, "screen"), (7, "heater")))
//定制自己想要筛选的key,然后放到sampleByKey中去
val sampleMap = List((7, 0.4), (6, 0.6)).toMap
randRDD.sampleByKey(false, sampleMap,42).collect

res1: Array[(Int, String)] = Array((6,book), (7,tv), (7,heater))

59、saveAsObjectFile

原型 
def saveAsObjectFile(path: String)

含义 
saveAsObjectFile 把RDD数据保存成二进制格式

示例

val x = sc.parallelize(1 to 10, 3)
//保存成二进制文件
x.saveAsObjectFile("objFile")
//读取上面保存的而二进制文件,[Int]用于提示对象类型
val y = sc.objectFile[Int]("objFile")
y.collect
res1: Array[Int] =  Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

60、saveAsSequenceFile [SeqFile]

原型 
def saveAsSequenceFile(path: String, codec: Option[Class[_ <: CompressionCodec]] = None)

含义 
saveAsSequenceFile 把RDD数据保存成Hadoop 序列文件

示例

//将这个数据保存到hdfs中去
val v = sc.parallelize(Array(("owl",3), ("gnu",4), ("dog",1), ("cat",2), ("ant",5)), 2)
//这个功能非常实用,可以直接操作hdfs文件
v.saveAsSequenceFile("hdfs://192.168.10.71:9000/wc2")

61、saveAsTextFile

原型 
def saveAsTextFile(path: String) 
def saveAsTextFile(path: String, codec: Class[_ <: CompressionCodec])

含义 
saveAsTextFile 把RDD数据保存成文本文件

示例

val a = sc.parallelize(1 to 10000, 3)
a.saveAsTextFile("mydata_a")
//保存时,还可以定制压缩格式,这样可以节省空间
import org.apache.hadoop.io.compress.GzipCodec
a.saveAsTextFile("mydata_b", classOf[GzipCodec])

62、stats [Double]

原型 
def stats(): StatCounter

含义 
stats 统计学方法,同时计算RDD中的平均值,方差,标准差,最大值和最小值

示例

val z = sc.parallelize(1 to 10,3)
z.stats
//同时计算统计值,
res1: (count: 10, mean: 5.500000, stdev: 2.872281, max: 10.000000, min: 1.000000)

63、sortBy

原型 
def sortBy[K](f: (T) ⇒ K, ascending: Boolean = true, numPartitions: Int = this.partitions.size)(implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T]

含义 
sortBy 用于排序,第一个参数用于指定将待排序的RDD元素转换成要排序的key,根据这个指定的key来排序,第二个参数如果为true表示升序,否则为降序

示例

//对于普通的单个元素,按照一般的排序
val y = sc.parallelize(Array(5, 7, 1, 3, 2, 1))
//true指定排序方式为升序
y.sortBy(c => c, true).collect
res1: Array[Int] = Array(1, 1, 2, 3, 5, 7)

//false表示按照降序排序
y.sortBy(c => c, false).collect
res2: Array[Int] = Array(7, 5, 3, 2, 1, 1)

//对于元组,则需要指定将元组映射到要排序的key上
val z = sc.parallelize(Array(("H", 10), ("A", 26), ("Z", 1), ("L", 5)))

//此处表示按照每个元组的第一个值排序
z.sortBy(c => c._1, true).collect
res3: Array[(String, Int)] = Array((A,26), (H,10), (L,5), (Z,1))

//此处表示按照每个元组的第二个值排序
z.sortBy(c => c._2, true).collect
res4: Array[(String, Int)] = Array((Z,1), (L,5), (H,10), (A,26))

64、sortByKey [Ordered]

原型 
def sortByKey(ascending: Boolean = true, numPartitions: Int = self.partitions.size): RDD[P]

含义 
sortByKey 是sortBy 的一个简单应用,他使用的时候不需要用户指定排序key,而是直接排序。只能对key-value类型使用。

示例

val a = sc.parallelize(List("dog", "cat", "owl", "gnu", "ant"), 2)
val b = sc.parallelize(1 to a.count.toInt, 2)
val c = a.zip(b)
c.sortByKey(true).collect
res1: Array[(String, Int)] = Array((ant,5), (cat,2), (dog,1), (gnu,4), (owl,3))

65、stdev [Double], sampleStdev [Double]

原型 
def stdev(): Double 
def sampleStdev(): Double

含义 
stdev 调用stats 函数,取得RDD中的标准差,divides by N 
sampleStdev 调用stats 函数,取得RDD中的标准差,divides by N-1,对于数据量很大的情况下适用

示例

//这里可以体现stdev和sampleStdev的区别
val d = sc.parallelize(List(0.0, 0.0, 1.0), 3)
d.stdev
res14: Double = 0.4714045207910317
d.sampleStdev
res15: Double = 0.5773502691896257

66、subtract

原型 
def subtract(other: RDD[T]): RDD[T] 
def subtract(other: RDD[T], numPartitions: Int): RDD[T] 
def subtract(other: RDD[T], p: Partitioner): RDD[T]

含义 
subtract 求两个集合的差,A-B

示例

//和数学上的集合相减类似
val a = sc.parallelize(1 to 9, 3)
val b = sc.parallelize(1 to 3, 3)
val c = a.subtract(b)
c.collect
res1: Array[Int] = Array(6, 9, 4, 7, 5, 8)

67、subtractByKey [Pair]

原型 
def subtractByKey[W: ClassTag](other: RDD[(K, W)]): RDD[(K, V)] 
def subtractByKey[W: ClassTag](other: RDD[(K, W)], numPartitions: Int): RDD[(K, V)] 
def subtractByKey[W: ClassTag](other: RDD[(K, W)], p: Partitioner): RDD[(K, V)]

含义 
subtractByKey 两个RDD先按照key分组,二者相减A-B,key相同,都会消除。如果A中没有,B中有,那么就会丢弃

示例

//丢弃A中不存在的,key相同的都会消除
val a = sc.parallelize(List("dog", "tiger", "lion", "cat", "spider", "wolf"), 2)
val b = a.keyBy(_.length)
val c = sc.parallelize(List("ant", "falcon", "squid","abcdefg"), 2)
val d = c.keyBy(_.length)
b.subtractByKey(d).collect

res15: Array[(Int, String)] = Array((4,lion),(4,wolf))

68、sum [Double], sumApprox [Double]

原型 
def sum(): Double 
def sumApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]

含义 
sum 计算RDD中元素的总和,要求输入一个数字类型的RDD

示例

val x = sc.parallelize(1 to 10)
x.sum
res1: Double = 55.0

68、sum [Double], sumApprox [Double]

原型 
def sum(): Double 
def sumApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble]

含义 
sum 计算RDD中元素的总和,要求输入一个数字类型的RDD

示例

val x = sc.parallelize(1 to 10)
x.sum
res1: Double = 55.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值