spark RDD编程

本文详细介绍了Spark中的弹性分布式数据集(RDD)的概念,包括创建RDD的两种方法:从内存和磁盘。重点讨论了RDD的操作,如转化操作(filter、map、flatMap)和行动操作(count、take、reduce、aggregate),以及惰性求值和持久化。还提到了RDD的转化操作与行动操作的区别,并提供了Java和Python的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RDD,也就是 弹性分布式数据集 的简称,它是spark处理的分布式元素集合。
对于RDD的操作包括: 创建RDD(从外部数据或者内存中的数据),转化RDD(利用筛选条件等),调用RDD操作求值

**注意:RDD的操作分为两种:一种是 “转化操作”,这种操作相当于只是定义了RDD,例如从一个RDD筛选出另一个RDD。转化操作的特点就是:返回结果仍然是一个RDD对象,转化操作并不会立刻执行,而是会惰性的执行,也就是到了不得不执行的时候才执行。另一种是 “行动操作”,是指调用RDD对象的方法返回一些值,例如统计一个文本RDD有多少行等.

**对于可能重复使用的RDD,可以使用persist()方法将其保存在内存中(也可以通过选项将其保存在磁盘上),默认情况下,cache()方法与persist()方法效果一样。



一、创建RDD的方法
①可以直接使用sc的parallelize()方法将数组参数转换成RDD对象,例如:

>>> line= sc.parallelize(["hello this is the first line","this is the second line","hi I am the third","this is the last line"])
>>> for a in line.take(line.count()):
...     print(a)
...
hello this is the first line
this is the second line
hi I am the third
this is the last line
>>>

这是在python脚本中执行的方法,如果是在java中的话,使用方法如下:

SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("test02");
JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
//从内存中插入
JavaRDD<String> line1 = javaSparkContext.parallelize(Arrays.asList("this is first line", "second line", "last line bye"));
//输出(行动操作)
int n = (int) line1.count();
List<String> list1 = line1.take(n);
for (int i = 0; i < list1.size(); i++) {
    System.out.println(list1.get(i));
}


但是在大数据处理过程中,一般这种做法是不存在的,因为大量数据是不会从内存中导入的,而是要从磁盘中读取。

②从磁盘中读取文本文件的方法

从磁盘中读取文本文件使用方法如下:
>>> line= sc.textFile("D:\spark\README.md")
>>> line2=line.filter(lambda a:"Java" in a)
>>> for m in line2.take(line2.count()):
...     print(m)
...
high-level APIs in Scala, Java, Python, and R, and an optimized engine that
>>>

这里使用了python中的lambda表达式筛选出含有Java的行数。

在java应用程序中使用这种方式也类似:

//从外部文本文件读取
JavaRDD<String> line2 = javaSparkContext.textFile("D:\\spark\\README.md");
//筛选(转化操作)
line2 = line2.filter(new Function<String, Boolean>() {
    public Boolean call(String s) throws Exception {
        return s.contains("Python");
    }
});
//输出
int m = (int) line2.count();
List<String> list2 = line2.take(m);
for (int i = 0; i < list2.size(); i++) {
    System.out.println(list2.get(i));
}


关于惰性求值:当执行转化操作,例如 sc.textFile(" ... ") 的时候,其实并没有从文件中读取数据,所以即使文件路径不存在,也不会报错,但是我们可以通过行动操作来检测前面的转化操作有没有问题。


二、RDD的相关操作
①筛选元素的转化操作, filter()
在java中,使用filter要传入一个Function<String,Boolean>类的继承类,该类的public Boolean call(String s)方法返回一个bool值,返回true表示符合筛选条件。
line2 = line2.filter(new Function<String, Boolean>() {
    public Boolean call(String s) throws Exception {
        return s.contains("Python");
    }
});


②联合两个RDD的方法, union()
使用方法在各个语言中一样,都是传入一个RDD参数,然后将两个RDD联合在一起。
下面是shell中使用的示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值