导航
导航
文章目录
  1. RDD
    1. 数据核心-RDD
    2. RDD的创建
    3. RDD的操作
    4. 传递参数
    5. 持久化
    6. 常见的RDD操作
  2. 键值对、数据读取与保存
    1. 键值对RDD
    2. pairRDD创建
    3. pairRDD的操作
    4. 数据的读取与保存
  3. Spark进阶
    1. 累加器
    2. 广播变量
    3. 数值RDD的操作
  4. Spark SQL与Spark Streaming

Spark快速大数据分析—读书笔记(二)

RDD

数据核心-RDD

接下来说下Spark的核心RDD。RDD-弹性分布式数据集,其实就是分布式的元素集合,在Spark里面对数据的操作无外乎都是围绕RDD来实现的。
RDD特点:1、不可变 2、分布式

RDD的创建

1、读取一个外部数据集

lines = sc.textFile("README.md")

2、在程序里分发对象集合(对集合进行并行化)

lines = sc.parallelize([a,b,c,d])

RDD的操作

正因为RDD的不可变,所以进行数据操作时引入两种操作:
1、Tansformation(转化操作):
返回一个新的RDD。但是转化出来的RDD是惰性的,即转化后不会马上计算,只有在Action行动操作时候才会生效。

2、Action(行动操作):
返回执行结果,Spark真正的计算,结果返回到内存或者其他像hdfs外部储存系统中。

传递参数

1、lambda表达式(适用于比较短的函数)

word = rdd.filter(lambda s:"error" in s)

def containsError(s):
return "error" in s
word = rdd.filter(containsError)

2、def函数
会把整个对象传递过去。但是要注意如下错误:


class SearchFuctions(object):
def __init__(self):
self.query = query

def getQuery(self, rdd):
#问题:因为在"self.query"中引用了整个self
return rdd.map(lambda s: self.query + x)

如果你传递的对象是某个对象的成员或者是引用某个函数的一个字段,会出现错误。
解决方法:
改成局部变量


class SearchFuctions(object):
def __init__(self):
self.query = query

def getQuery(self, rdd):
#需要的字段提取到局部变量中即可
queryLocal = self.query
return rdd.map(lambda s: queryLocal + x)

持久化

Spark的RDD是惰性的,如果多次使用同一个RDD,进行执行操作就会多次重算RDD以及它的所有依赖。极大的消耗内存。对此,我们使用RDD.persist(),Spark对数据实现持久化,默认是LRU的缓存策略。如果想手动移除持久化的RDD 可以使用RDD.unpersist()操作。

常见的RDD操作

1、map() 与filter()区别:一张图足以(来源书贴图)

2、伪集合操作
distinct()
union()
intersection()
subtract()

3、常用的行动操作
reduce()
collect()
take(n)
top()
count()

键值对、数据读取与保存

键值对RDD

键值对RDD 记做pairRDD 通常用来进行聚合计算。 你可以把它理解成 map(有误请指正)

pairRDD创建

1、键值对的数据格式读取时直接返回为pairRDD
2、通过map()函数把普通的RDD转为pairRDD

pairRDD的操作

1、转化操作

2、行动操作

数据的读取与保存

之前谈到的都是Spark对本地集合或者普通文件中的数据的操作。如果大数据量或者是分布式的情况下,问题该怎么解决呢?接下来谈谈实用方法了。
三种常见的数据源以及Spark对应的读取与保存
1、文件格式与文件系统
2、SparkSQL中的结构化数据源
3、数据库与键值存储

Spark进阶

介绍2点
1、Spark中两种类型的共享变量:累加器与广播变量
2、数值RDD的操作

集群上运行Spark和Spark调优与调试这块,为了不误人子弟后续深入后再补
ps:坑已补 请戳—>补漏篇

累加器

对信息进行聚合,常见用途就是在调试中对作业执行过程中的事件进行计数

广播变量

作用是高效分发较大的对象

数值RDD的操作

Spark SQL与Spark Streaming