解析器集成
Scala解析器处理一般过程:
1 将用户输入每一行编译成一个类
2 将该类载入到JVM中
3 调用该类中的某个函数
内存管理
1 未序列化Java对象存储在内存中
2 序列化的数据存于内存中
3 存于磁盘中
内存使用LRU(最近最少)回收算法管理
RDD编程接口
1 RDD分区(Partitions)
2 RDD首选位置(PreferredLocations):离数据最近的位置
3 RDD依赖关系(Dependencies):窄依赖和宽依赖
>窄依赖:每个父类RDD的分区都至多被一个子RDD的分区使用
>宽依赖:多个子RDD的分区依赖同一个父RDD的分区
4 RDD分区计算(Iterator)
5 RDD分区函数(Partitioner)
>哈希分区划分器(HashPartitioner)
>范围分区划分器(RangePartitioner)
且Partitioner只存在键值对RDD中,非键值对RDD其partitioner值为None
创建操作
1.并行化集合创建操作
parallelize、makeRDD—-后者可以指定每一个分区的首选位置
2.外部存储创建操作
textFile、wholeTextFiles、SequenceFile(针对Hadoop存储二进制形式的键值对)、hadoopFile、newAPIHadoopFile
转换操作
map与flatMap
原RDD中每个元素经过map处理后只能生成一个新的元素,而经过flatMap每个元素可以生成1个或多个元素构成新的RDD,flatMap多用于分词
distinct
去掉RDD中的重复元素
coalesce与repartition
都是对RDD的重新分区,coalesce操作使用HashPartitioner,第一个参数为重分区数目。第二个参数为是否shuffle,默认false;repartition是coalesce第二个参数为true的情况
randomSplit与glom
都是对RDD的划分,randomSplit操作根据weights权重将一个RDD划分为多个RDD,其返回结果为Array[RDD[T]];glom操作是根据RDD的partition作为划分,返回结果是为RDD[Array[T]]
union、intersection与subtract
union是两个RDD的并集,返回元素不去重;interserction是两个RDD的交集,返回元素去重;subtract返回在rdd中出现,other中不出现的元素,返回元素不去重。
mapPartition与mapPartitionWithInedx
mapPartition与map相比,映射的参数由RDD中的每个元素变成了每个RDD分区的迭代器(在映射中频繁创建额外对象,mapPartition效率要高)。mapPartitionWithIndex操作类似与mapPartition,只是输入参数多了一个分区索引
zip与zipPartitions
zip是将两个RDD组合成键值对形式(默认RDD的partition数与元组都是一样的);zipPartitions将多个RDD按照Partitions组合,对每个分区内元素数无要求
zipWithIndex与zipWithUniqueId
zipWithIndex操作将RDD中的元素和这个元素所在的RDD中ID(索引号)组合成键值对;zipWithUniqueId操作将RDD中的元素与一个唯一ID组和成键值对。
每个分区中第一个元素的唯一ID:该分区的索引号
每个分区中第N 个元素的唯一ID:前一个元素的唯一ID+该RDD的总分区数
键值对转换操作
partitionBy、mapValues、flatMapValues
partitionBy操作是根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区;
mapValues操作类似map,不过只针对Values;FlatMapValues也是类似。
combineByKey与foldByKey
combineByKey操作用于将RDD[K,V]转换成RDD[K,C],V、C类型不必相同。foldByKey操作是根据key对value折叠、合并处理,预先把V映射到每个value上。
注:combineByKey中参数含义:
createCombiner:组合器函数,用于将V类型变成C类型
mergeValue:合并值函数,将一个C类型和一个V类型合并成一个C类型
mergeCombiner:合并组合数函数,将两个C合并成一个C
numPartitions、partition:分区数与分区方法
mapSideCombine:是否需要在Map端进行combine操作
reduceByKey与groupByKey
reduceByKey操作用于将RDD[K,V]中每个K对应的V值根据映射函数来运算;groupByKey操作用于将RDD[K,V]中K对应的V合并到一个Iterable[V]中
注:reduceByKeyLocally操作将结果映射到一个Map[K,V]中。
cogroup
cogroup相当于SQL中的全外关联,返回左右RDD中的记录,关联不上的为空。
join、fullOuterJoin、leftOuterJoin、rightOuterJoin、subtractByKey
join、fullOuterJoin、leftOuterJoin、rightOuterJoin都是针对RDD[K,V]中K值相等的连接操作,分别对应于内连接、全连接、左连接、右连接,这些操作都是调用cogroup进行实现的。subtract
ByKey是针对键值的,输出只存在左边的键值对
控制操作
cache、persist、checkpoint
cache(MEMORY_ONLY)是persist的一种特例,checkpoint设置检查点(sc.setCheckpointDir(“”))
例如a.persist(org.apache.spark.storage.StorageLevel.DISK_ONLY)
行动操作
集合标量行动操作
函数 | 功能 |
---|---|
first() | 返回RDD中第一个元素 |
count() | RDD中元素个数,类型Long |
collect() | 汇集节点数据,将RDD转换成数组 |
collectAsMap() | 汇集节点数据,将RDD转换成Map |
take(n) | 从RDD中取n个元素 |
top(n) | 按照升序(或降序、某种规则),取n个元素 |
takeOrdered(n) | 与top类似,不过取的顺序相反 |
aggregate() | |
fold() | |
lookup() | 返回RDD中K对应的所有V |
countByKey() | 统计Key的数量,返回为Map类型 |
countByValue() | 按Value统计,返回为Map类型 |
foreach() | 循环 |
foreachPartition() | 循环单位为Partition |
sortBy() | 排序,默认为true、升序 |
存储行动操作
函数 | 功能 |
---|---|
saveAsTextFile() | 保存为文本文件格式 |
saveAsSequenceFile() | 以Sequence文件保存到HDFS上 |
saveAsObjectFile() | 将RDD中的元素序列化,存储在文件中 |
saveAsHadoopFile() | 支持老版本Hadoop API |
saveAsHadoopDataset() | 将RDD保存到除了HDFS以外的其他存储,例如HBase |
saveAsNewAPIHadoopFile() | 支持新版本Hadoop API |
补充算子
函数 | 功能 |
---|---|
cartesian() | 返回两个RDD的元素的笛卡尔积 |
countApproxDistinct() | 计算不同值的近似数?? |
countApproxDistinctByKey() | |
filter() | 过滤 |
filterByRange() | 经过sortByKey之后的过滤 |
getCheckpointFile() | 获取检查点 |
isCheckpoint() | 是否已被存储 |
histogram() | |
takeSample() | 采样 |
variance() | 方差 |
更详细的RDD实例:
http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html