You are on page 1of 3

北京课工场教育科技有限公司

Spark 处理数据的本质是对 RDD 的操作(创建、转化、处理)


RDD(弹性数据集)是 Spark 提供的最重要的抽象的概念,它是一种有容错机制的特殊集合,
可以分布在集群的节点上,以函数式编操作集合的方式,进行各种并行操作。

创建 RDD 的方法
从集合创建
val lines = sc.parallelize(List("aa","bb"))
从文件创建
本地文件
val lines = sc.textFile("file:///home/hadoop/app/spark-1.6.1-bin-2.6.0-
cdh5.7.0/README.md")
HDFS
val lines = sc.textFile("hdfs://hadoop000:9000/afile")

RDD 支持两类操作
转化操作(transformation)和行动操作(action)
无论执行了多少次 transformation 操作,RDD 都不会真正执行运算,只有当 action 操作
被执行时,运算才会触发。
加载本地文件:
val input=sc.textFile("/home/hadoop/app/spark-1.6.1-bin-2.6.0-cdh5.7.0/README.md")
过滤 input 中包含 a 的行:
val input_a=input.filter(line=>line.contains("a"))
过滤 input 中包含 b 的行:
val input_b=input.filter(line=>line.contains("b"))
过滤 input_a 中包含 d 的行:
val input_d=input_a.filter(line=>line.contains("d"))
显示 input_a 中的第一行
input_a.first()
转化操作(transformation):
map()
flatMap()
first():返回第一个元素
filter():过滤
distinct():元素去重
union():输出两个 RDD 的所有元素,不去掉重复元素
intersection():输出两个 RDD 的相同元素,驱虫
subtract():返回包含在第一个 RDD 中但是不包含在第二个 RDD 中的元素,不去重
cartesian():返回两个元素的笛卡尔积
zip()
zip()操作
定义一个常量 words:
val words=sc.parallelize(List("kgc","kegongchang","spark","hello"))
取的常量 words 每行的长度:

客服邮箱:ke@kgc.cn 1/3
北京课工场教育科技有限公司
val words_length=words.map(_.length).collect()
结果为:Array[Int] = Array(3, 11, 5, 5)
对两个 RDD 进行并行遍历
words.zip(words_length).collect()
结果为 Array[(String, Int)] = Array((kgc,3), (kegongchang,11), (spark,5), (hello,5))
生成一个 1 到 4 的 RDD num1
val num1=sc.parallelize(1 to 4 ,2)
对 num1 进行 flatMap 操作生成 num2
val num2=num1.flatMap(x=>1 to x)
num2.collect()的结果为 Array[Int] = Array(1, 1, 2, 1, 2, 3, 1, 2, 3, 4)

map()和 flatMap()操作
定义 lines
val lines=sc.parallelize(List("hello spark","kegongchang"))
对 lines 进行 flatMap 操作
lines.flatMap(line=>line.split(" ")).collect()
结果为 Array[String] = Array(hello, spark, kegongchang)
对 lines 进行 map 操作
lines.map(line=>line.split(" ")).collect()
结果为 Array[Array[String]] = Array(Array(hello, spark), Array(kegongchang))
Map 处理完成生成一个元素,而 flatmap 可以生成多个元素构建新的 RDD

union()、intersection()、subtract()、cartesian()操作
val num1=sc.parallelize(List("aa","bb","cc","cc"),2)
Num1.collect()的结果为 Array[String] = Array(aa, bb, cc, cc)
val num2=sc.parallelize(List("cc","dd"),2)
num2.collect()的结果为 Array[String] = Array(cc, dd)
num1.union(num2).collect()
结果为 Array[String] = Array(aa, bb, cc, cc, cc, dd)
num1.intersection(num2).collect()
结果为 Array[String] = Array(cc)
num1.subtract(num2).collect()
结果为 Array[String] = Array(aa, bb)
num1.cartesian(num2).collect()
结 果 为 Array[(String, String)] = Array((aa,cc), (bb,cc), (aa,dd), (bb,dd), (cc,cc), (cc,cc),
(cc,dd), (cc,dd))

行动操作(action):
collect():返回全部元素
take():返回指定数量的元素
foreach():应用方法到每一个元素
count():统计元素总量

客服邮箱:ke@kgc.cn 2/3
北京课工场教育科技有限公司
countByValue():统计每一个元素的数量,返回一对键值对
reduce():对每个元素进行逐个合并

val lines = sc.textFile("file:///home/hadoop/app/spark-1.6.1-bin-2.6.0-cdh5.7.0/README.md")


lines.take(2)的结果为 Array[String] = Array(# Apache Spark, "")

lines.take(3).foreach(println)的结果为:
# Apache Spark

Spark is a fast and general cluster computing system for Big Data. It provides

lines.count()的结果为 Long = 95

val num=sc.parallelize(1 to 10,2)


num.collect()的结果为 Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
num.reduce((x,y)=>x+y)的结果为 Int = 55

客服邮箱:ke@kgc.cn 3/3