Spark RDD 初探
弹性分布式数据集(Resilient Distributed Dataset,RDD)是Spark中的核心概念,基本上所有的Spark运算操作对象都是RDD,我们今天就来简单认识一下这个RDD。
说明:由于本文的开发基于Java,因此所有的观点都是基于Java的。
一、RDD 创建
RDD是一种数据集,初步我们可以将其想象成一个数组类似的数据结构,先不去管实际的存储结构。RDD的创建方式可以划分成两大类。
(一)从Driver程序的数据集生成RDD
直说就是程序本身数据生成RDD,不是从外部导入的数据。一般是通过SparkContext对象(实际为JavaSparkContext)的parallelize方法来创建RDD。
SparkSession session = SparkSession.builder().getOrCreate();
JavaSparkContext sparkContext = JavaSparkContext.fromSparkContext(session.sparkContext());
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<String> list2 = Arrays.asList("hello", "RDD", "Spark");
JavaRDD<Integer> myRDD1 = sparkContext.parallelize(list1);
JavaRDD<String> myRDD2 = sparkContext.parallelize(list2);
上述代码中myRDD1和myRDD2均为通过程序的数据集生成的RDD。
Java开发中RDD(实际为JavaRDD)只能通过List数据类型来生成。
(二)从外部数据集生成RDD
从外部数据集加载的相关方法有很多,包括(可能不限于)如下列举的方法。
- textFile方法,从文本文件加载。
- hadoopFile方法,从Hadoop文件加载。
- sequenceFile方法。
- objectFile方法,读取序列化文件。
- binaryFiles方法,以二进制格式直接读取Hadoop MapReduce计算的结果文件。
- hadoopRDD方法,读取HBase文件。
JavaRDD<Integer> myRDD = sparkContext.textFile(inputFile);
二、RDD 操作
RDD的操作分为两大类,分别是Transformation(转换)和Action(动作)。Spark进行Transformation时采用lazy模式,即计算不是立刻执行,只有当Action操作触发时才会进行启动运算。
- Transformation:由一个RDD生成另一个RDD的过程。
- map(function)
- 对RDD中的每个元素进行function操作,生成新元素构成的新RDD返回。
- filter(function)
- 对RDD中的元素进行过滤,如果调用函数返回true则保留,返回过滤后的RDD。
- flatMap(function)
- 与map类似,但是每个元素调用之后可能会产生0至多个元素,将这些所有的元素全部扁平化构成一个新的RDD,要求function的返回类型为Se
- map(function)