1.RDD介绍:
RDD,弹性分布式数据集,即分布式的元素集合。在spark中,对所有数据的操作不外乎是创建RDD、转化已有的RDD以及调用RDD操作进行求值。在这一切的背后,Spark会自动将RDD中的数据分发到集群中,并将操作并行化。
Spark中的RDD就是一个不可变的分布式对象集合。每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。RDD可以包含Python,Java,Scala中任意类型的对象,甚至可以包含用户自定义的对象。
用户可以使用两种方法创建RDD:读取一个外部数据集,或在驱动器程序中分发驱动器程序中的对象集合,比如list或者set。
RDD的转化操作都是惰性求值的,这意味着我们对RDD调用转化操作,操作不会立即执行。相反,Spark会在内部记录下所要求执行的操作的相关信息。我们不应该把RDD看做存放着特定数据的数据集,而最好把每个RDD当做我们通过转化操作构建出来的、记录如何计算数据的指令列表。数据读取到RDD中的操作也是惰性的,数据只会在必要时读取。转化操作和读取操作都有可能多次执行。
2.创建RDD数据集
(1)读取一个外部数据集
JavaRDD lines=sc.textFile(inputFile);
(2)分发对象集合,这里以list为例
List list=new ArrayList();
list.add("a");
list.add("b");
list.add("c");
JavaRDD temp=sc.parallelize(list);
//上述方式等价于
JavaRDD temp2=sc.parallelize(Arrays.asList("a","b","c"));
3.RDD操作
(1)转化操作
用java实现过滤器转化操作:
List list=new ArrayList();
//建立列表,列表中包含以下自定义表项
list.add("error:a");
list.add("error:b");
list.add("error:c");
list.add("warning:d");
list.add("hadppy ending!");
//将列表转换为RDD对象
JavaRDD lines = sc.parallelize(list);
//将RDD对象lines中有error的表项过滤出来,放在RDD对象errorLines中
JavaRDD errorLines = lines.filter(
new Function() {
public Boolean call(String v1) throws Exception {
return v1.contains("error");
}
}
);
//遍历过滤出来的列表项
List errorList = errorLines.collect();
for (String line : errorList)
System.out.println(line);
输出:
error:a
error:b
error:c
可见,列表list中包含词语error的表项都被正确的过滤出来了。
(2)合并操作
将两个RDD数据集合并为一个RDD数据集
接上述程序示例:
union
输出:
error:a
error:b
error:c
warning:d
可见,将原始列表项中的所有error项和warning项都过滤出来了。
(3)获取RDD数据集中的部分或者全部元素
①获取RDD数据集中的部分元素 .take(int num) 返回值List
获取RDD数据集中的前num项。
/*** Take the first num elements of the RDD. This currently scans the partitions *one by one*, so* it will be slow if a lot of partitions are required. In that case, use collect() to get the* whole RDD instead.*/def take(num: Int): JList[T]
程序示例:接上
JavaRDD unionLines=errorLines.union(warningLines);
for(String line :unionLines.take(2))
System.out.println(line);
输出:
error:a
error:b
可见,输出了RDD数据集unionLines的前2项
②获取RDD数据集中的