RDD的创建方式
1)从Hadoop文件系统输入创建,如HDFS,HIVE,HBase;
2)从父RDD转换得到新的RDD,如常见的transformation
3)通过parallelize或者makeRDD将单机数据转换为RDD
4)基于数据流创建,如kafka流;
一、从集合创建RDD
1、利用parallelize,函数是def parallelize[T](seq: Seq[T], numSlices: Int = defaultParallelism)(implicit arg0: ClassTag[T]): RDD[T]
var rdd = sc.parallelize(Array(1,2,3,45),3)
var rdd1 = sc.parallelize(1 to 10) 默认的分区数是cpu的核数
2、makeRDD创建
def makeRDD[T](seq: Seq[T], numSlices: Int = defaultParallelism)(implicit arg0: ClassTag[T]): RDD[T]
var rdd = sc.makeRDD(1 to 10)
二、从外部存储创建RDD
var rdd
:
RDD[String]
=
sc.textFile(
"file:///D:/sparkdata.txt"
,
1
)
var rdd
:
RDD[String]
=
sc.textFile(
"/sparkdata.txt"
,
1
) 从hdfs
RDD的基本操作
RDD的基本操作
操作类型 | 函数名 | 作用 |
转化操作 | map() | 参数是函数,函数应用于RDD每一个元素,返回值是新的RDD |
flatMap() | 参数是函数,函数应用于RDD每一个元素,将元素数据进行拆分,变成迭代器,返回值是新的RDD | |
filter() | 参数是函数,函数会过滤掉不符合条件的元素,返回值是新的RDD | |
distinct() | 没有参数,将RDD里的元素进行去重操作 | |
union() | 参数是RDD,生成包含两个RDD所有元素的新RDD | |
intersection() | 参数是RDD,求出两个RDD的共同元素 | |
subtract() | 参数是RDD,将原RDD里和参数RDD里相同的元素去掉 | |
cartesian() | 参数是RDD,求两个RDD的笛卡儿积 | |
行动操作 | collect() | 返回RDD所有元素 |
count() | RDD里元素个数 | |
countByValue() | 各元素在RDD中出现次数 | |
reduce() | 并行整合所有RDD数据,例如求和操作 | |
fold(0)(func) | 和reduce功能一样,不过fold带有初始值 | |
aggregate(0)(seqOp,combop) | 和reduce功能一样,但是返回的RDD数据类型和原RDD不一样 | |
foreach(func) | 对RDD每个元素都是使用特定函数 |
数据集中的每个元素经过用户自定义的函数转换形成一个新的RDD,新的RDD叫MappedRDD
rdd.map(_*2)
2、flatMap(func)操作
对每个元素都可以映射为0个或者多个输出
3、.mapPartitions(func):类似与map,map作用于每个分区的每个元素,但mapPartitions作用于每个分区
4、union(ortherDataset):将两个RDD中的数据集进行合并,最终返回两个RDD的并集,若RDD中存在相同的元素也不会去重
5、intersection(otherDataset):返回两个RDD的交集
6、distinct([numTasks]):对RDD中的元素进行去重
7、cartesian(otherDataset):对两个RDD中的所有元素进行笛卡尔积操作
8、coalesce(numPartitions,shuffle):对RDD的分区进行重新分区,shuffle默认值为false,当shuffle=false时,不能增加分区数