1
2
3.RDD编程
3.1
3.2创建RDD
两种方式:读取外部数据集和在驱动程序中对一个集合进行并行化。
3.3RDD操作
转化操作和行动操作:转化操作会返回一个新的RDD,比如map()、filter();行动操作是向驱动器程序返回结果或把结果写入外部系统,会触发实际的计算,返回的类型是其他的数据类型。
3.3.1转化操作
文件:
this is error test error is not
erro or err which is errorso error
error end
end waring
the end
程序:
inputRDD = sc.textFile(""/Users/didi/cyj/Files/error.txt"")
errorRDD = inputRDD.filter(lambda x:"error" in x)
waringRDD = inputRDD.filter(lambda x:"waring" in x)
badlinesRDD = errorRDD.union(waringRDD)
结果:
返回包含error的每一行作为一个元素
errorRDD:
[u'this is error test error is not ', u'erro or err which is errorso error', u'error end']
badlinesRDD:
[u'this is error test error is not ', u'erro or err which is errorso error', u'error end', u'end waring']
关键词:
sc.textFile()
.filter()
.union()
spark的谱系图:用来记录不用RDD之间的依赖关系
3.3.2行动操作
代码:
badlinesRDD.count()
for line in badlinesRDD.take(2):
... line
输出:
4
u'this is error test error is not '
u'erro or err which is errorso error'
关键词:
.first():返回首行
.count():对RDD中的行进行计数
.take():获取RDD中的少量数据
.collect():用来获取整个RDD中的数据
每当调用一个新的RDD行动操作时候,整个RDD都会从头开始计算,要避免这种低效行为,将中间结果持久化。
3.3.3惰性求值
不应该把RDD看作是一个存放特定数据的数据集,而应该看作通过转化而构建出来的、记录如何计算数据的指令列表,当我们调用sc.textFile()时候,数据并没有读进来,而是在必要时才会读取。
3.4向spark传递函数(P28)
3.4.1注意问题:传递的对象是某个对象的成员时,或者包含某个对象中一个字段的引用时,spark会把整个对象发到工作节点上,这样一来传递的东西可能会大得多。所以,解决方案是把你需要的字段从对象中拿出来放到一个局部变量中,然后进行传递。
3.5常见的转化操作和行动操作
3.5.1基本RDD
1.针对各个元素的转化操作:
(1).map()转化操作
map接收一个函数,把这个函数用于RDD中的每个元素,将函数的返回结果作为结果RDD中对应元素的值;
map()函数的输入类型和返回值类型可以不一样;
代码:
Python版计算RDD中各值的平方:
nums = sc.parallelize([1,2,3,4])
squared = nums.map(lambda x:x*x).collect()
for num in squared:
... print("%i"%(num))
输出:
1
4
9
16
代码:
Scala版计算RDD中各值的平方:
val input = sc.parallelize((List(1,2,3,4))
val result = input.map(x=>x*x)
println(result.collect().mkString(","))
输出:
1,4,9,16
(2).flatMap()转化操作
对每个输入元素生成多个输出元素,返回的是一个返回值序列的迭代器;
代码:
Python版利用flatMap()将数据切分为单词:
lines = sc.parallelize(["hello world","hi"])
words = lines.flatMap(lambda line:line.split(" "))
words.first()
输出:
'hello'
代码:
Scala版利用flatMap()将数据切分为单词:
val lines = sc.parallelize(List("hello world","hi"))
val words = lines.flatMap(line => line.split(" "))
words.first()
输出:
res8: String = hello
(3).filter()
将RDD中满足该函数要求的元素放入新的RDD中;
(4).distinct():去重操作,元素唯一性
2.伪集合操作(P33):
union():并操作
intersection():交操作
subtract():减集合操作
cartesian():笛卡尔积操作
3.行动操作(P37):
reduce():
接受一个函数作为参数,这个函数要操