Spark学习笔记1-RDD编程

来源:互联网 发布:java线程状态 编辑:程序博客网 时间:2024/05/24 06:01

因为Spark本身是由Scala编写的,故文中仅以Scala API为例,python和java的API暂时不举例

1、RDD基础

Spark中的RDD ( Resilient Distributed Dataset ) 是一个不可变的分布式对象集合,也称为弹性分布式数据集。在Spark中对数据的操作无非是创建RDD,转化已有RDD,以及调用RDD操作进行求值。

2、RDD创建

创建RDD有两种方法:读取一个外部数据集,或者在驱动器程序里对一个集合(list,set)进行并行化

// 读取外部数据集,用Scala中的textFile()方法val line = sc.textFile("/path/test.txt")
// 在驱动器程序里对一个集合(list,set)进行并行化val lines = sc.parallelize(List("spark","i love scala"))

3、RDD操作

RDD的操作包括两种:转化操作和行动操作

3.1 转化操作

RDD的转化操作是返回新RDD的操作,比如map(),filter()。转化出来的RDD是惰性求值的,只有在行动操作中用到这些RDD才会被计算。

例1: 假如我们要对日志文件,X.log里的信息进行筛选,选出包含error的信息,我们可以这样做

// filter()转化操作val lines = sc.textFile("X.log")val errRDD = lines.filter(line => line.contains("error"))
3.2 行动操作

行动操作会把最终求得的结果返回到驱动器程序,或者写入外部存储系统中。
还是用之前日志的例子,我们向输出日志里有多少行error,并且输出前十行error

println("Log has " + errRDD.count().toString + "errors")println("Here are 10 examples: ")errRDD.take(10).foreach(println)

注: 当数据集小的时候,可以用collect()方法把数据放在内存里,但是绝大多数情况下,rdd数据集都比较大,不能用collect()方法。

4、常见的转化操作和行动操作

转化操作

4.1 map()操作

// 计算RDD中各值的平方val input = sc.textFile(List(1,2,3,4))val result = input.map(x => x*x)println(result.collect().maString(","))

4.2 flatMap( )操作:对每个输入元素生成多个输出元素

// flatMap()将行数据切分为单次val lines = sc.parallelize(List("hello word","hi"))val words = lines.flatMap(x => x.split(" "))words.first()  // 返回hello

4.3 filter( )操作:过滤

rdd.filter(x => x!=1)

4.4 distinct( )操作:去重

rdd.distinct()

4.5 sample( )操作:采样以及是否替换

rdd.sample(false,o.5)

4.6 union( )操作:合并两个RDD

rdd1.union(rdd2)

4.7 interaction( )操作:两个RDD求交集

rdd1.interaction(rdd2)

4.8 substract( )操作:移除一个RDD中的内容

rdd.substract(other)

4.9 cartesian( )操作:与另一个RDD的笛卡尔积

rdd1.cartesian(rdd2)

行动操作

4.10 reduce( )操作

// 对RDD中的数据求和val data = sc.parallelize(List(1,2,3,4))val sumData = data.reduce((x,y) => x+y)

4.10 aggregate( )操作

// 用aggregate()操作来计算RDD的平均值val result = input.aggregate((0,0))(    (acc,value) => (acc._1 + value, acc._2 + 1)    (part1,part2) => (part1._1 + part2._1 ,part1._2 + part2._2))val avg = result._1/result._2.toDouble

4.11 count( )操作:返回RDD中元素个数

rdd.count()

4.12 countByValue( )操作:各元素在RDD中出现的次数

rdd.countByValue()

4.13 take( )操作:从RDD中返回num个元素

rdd.take(2)

4.14 top( )操作:从RDD中返回前num个元素

rdd.top(num)

4.15 takeOrdered(num)(ordering)操作:从RDD中按照提供的顺序返回最前面的num个元素

rdd.takeOrdered(2)(myOrdering)

4.16 takeSample( )操作:从RDD中返回任意一些元素

rdd.takeSample(false,1)

4.17 foreach( )操作:对RDD的每个元素都使用给定的函数

rdd.foreach(func)
原创粉丝点击