RDD 编程
创建RDD方法
- 读取外部数据集
- 在驱动器程序里分发驱动器程序的对象集合(比如list和set)
转化操作: 会将一个RDD转化为另一个RDD
行动操作: 对RDD计算一个结果,并把结果返回到驱动器程序中,或把结果存储到外部存储系统中(hdfs中)
- 在行动操作中first()中,spark只需扫描文件知道找到第一个匹配的行动为止,而不需要读取整个文件。
- 如果想早多个行动操作中重用一个RDD,可以使用RDD.persist(),让RDD缓存下来。
创建RDD
parallelize()方法,处理测试和开发使用,一般情况不会使用,毕竟这种方式需要把你的数据集先放到一台机器的内存中。
判断RDD是转化操作和行动操作
可以看看它的返回值类型:
转化操作:返回的是RDD类型
行动操作:返回其他的数据类型
转化操作
转化操作时惰性求值,只有在行动操作中用到这个RDD时才会计算。
val inputRDD = sc.textFile("read.md")
inputRDD.filter(_.contians("error"))
注:inputRDD不会改变已有的inputRDD中的数据,在后面可以继续使用
collect()函数
作用:可以用来获取整个RDD中的数据,只有当你的整个数据集能在单个机器的内存中方得下时,才能使用collect()。
注意:每当我们调用一个新的行动操作时,整个RDD都会从头开始计算,避免这种低效的行为,用户可以将中间结果持久化。
常用的转化操作和行动操作
针对各个元素进行操作
map 输入函数,对每个元素运用这个函数,返回结果RDD
filter 输入函数,对每个元素运用这个函数,满足条件的元素组成新RDD
flatMap 将数据”扁平”处理,会得到个列表的元素组成的RDD,而不是各个列表组成的RDD。-
伪集合操作
distinct: RDD.distinct() 转化操作来生成一个包含不同元素的新RDD。distinct()操作开销很大,因为他需要将所有数据通过网络进行混洗(shuffle)。
union(other): 会返回两个RDD中所有元素RDD。
intersection: 返回两个RDD中都有的元素。性能较差,需要混洗。
subtract(other):函数接受另外一个RDD为参数,返回一个由第一个RDD存在,而第二个RDD不存在的所有元素组成的RDD。需要混洗
cartesian(): 笛卡尔积