写在前面
之前用DF数据类型比较多,RDD相对使用的比较少,回头再看只想说too simple too young。
Transformation 和Action
Transformation转换,对rdd而言,每次转换都会产生新的rdd。
Transformation得到的rdd是惰性求值的,整个转换过程只记录了转换的轨迹,并不是真正的计算,只有遇到Action操作时才会真正计算。
Action:代表的是一个具体的行为,返回的值非RDD类型,可以一个object,或者是一个数值,也可以为Unit代表无返回值,并且action会立即触发job的执行。
常见的操作类型
Transformation操作 | Action操作 |
---|---|
map | reduce |
flatmap | collect |
reduceByKey | count |
groupByKey | first |
union | take |
join | takeSample |
cogroup | SaveAsTextFile |
sample | SaveAsAequenceFile |
cartesian | countByKey |
sortBykey | foreach |
Transformaton函数
-
map(func,preservesPartitioning=False)
将原来RDD的每个数据通过map中的用户自定义函数func映射成一个新的元素。返回一个RDD。 -
filter(func)
选出所有func返回值为true的元素,最为一个新的RDD返回 -
mapreduce
-
flatmap(func, preservesPartitioning=False)
与map类似,但返回的是所有rdd映射函数func之后的序列集 -
sample(withReplacement, fraction, seed=None)
withReplacement=true 表示有放回抽样
fraction为抽样的概率【0,1】
raction=0.2并不是说明要抽出100个数字中20%的数据作为样本,而是每个数字被抽取为样本的概率为0.2,这些数字被认为来自同一总体,样本的大小并不是固定的,而是服从二项分布
seed为随机数种子
返回的是RDD的抽样子集 -
distinct(numPartitions=None)
返回去重之后的RDD
Action函数
-
c o l l e c t ( ) \color{red}{collect()} collect()
RDD的所有元素以列表的形式返回
一般在filter或者 足 够 小 \color{red}{足够小} 足够小的时候用
因 为 结 果 将 返 回 到 D r i v e r 程 序 所 在 节 点 \color{red}{因为结果将返回到Driver程序所在节点} 因为结果将返回到Driver程序所在节点 -
count()
返回RDD元素的个数 -
foreach(func)
RDD的每个元素调用func,不返回RDD或者list -
reduce(func)
-
first()
返回数据集中的第一个元素 -
take(num)
以 数 组 的 形 式 返 回 数 据 集 中 前 n 个 元 素 , 需 要 注 意 的 是 这 一 a c t i o n 并 不 是 在 多 个 n o d e 上 并 行 执 行 的 , 而 是 在 d r i v e r 程 序 所 在 的 机 器 上 单 机 执 行 , 会 增 大 内 存 的 压 力 , 使 用 时 需 谨 慎 \color{red}{以数组的形式返回数据集中前n个元素,需要注意的是这一action并不是在多个node上并行执行的,而是在driver程序所在的机器上单机执行,会增大内存的压力,使用时需谨慎} 以数组的形式返回数据集中前n个元素,需要注意的是这一action并不是在多个node上并行执行的,而是在driver程序所在的机器上单机执行,会增大内存的压力,使用时需谨慎
-countBykey()
计 算 每 个 元 素 的 个 数 , 以 字 典 的 形 式 返 回 到 m a s t e r \color{red} 计算每个元素的个数,以字典的形式返回到master 计算每个元素的个数,以字典的形式返回到master
map 和 flatMap的区别
map(f, preservesPartitioning=False)[source]
Return a new RDD by applying a function to each element of this RDD.
flatMap(f, preservesPartitioning=False)[source]
Return a new RDD by first applying a function to all elements of this RDD, and then flattening the results.
flaMap 是先map再扁平化
即将所有对象合并为一个对象
eg:
a=lines.map(lambda x:x.split(" "))
print(a.collect())
b=lines.flatMap(lambda x:x.split(' '))
print(b.collect())
res:
*ByKey 操作
操作 |
---|
sortByKey |
reduceByKey |
reduceByKeyLocally |
sampleByKey |
subtractByKey |
aggregateByKey |
combineByKey |
countByKey |
foldByKey |
groupBykey |
具体参考spark *ByKey操作