《spark快速大数据分析》 -- 总结

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():
接受一个函数作为参数,这个函数要操

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值