上一次分享提到的map、flatmap都归属于转换算子,foreach则属于Action算子;由于算在在spark中较为重要后续几次都是分享算子相关的东西,先来看一段代码
package com.debug;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;
public class RDDFilter {
public static void main(String[] args) {
SparkConf conf=new SparkConf();
conf.setMaster("local");
conf.setAppName("WordCountApp");
JavaSparkContext sc=new JavaSparkContext(conf);
//读取字数统计txt文件
JavaRDD<String> lines=sc.textFile("/home/cry/word1.txt");
JavaRDD<String> res=lines.filter(new Function<String, Boolean>() {
public Boolean call(String line) throws Exception {
//System.out.println("transformation类型的RDD已经触发执行");
return line.startsWith("hi");
}
});
res.foreach(new VoidFunction<String>() {
public void call(String line) throws Exception {
System.out.println(line);
}
});
sc.stop();
}
}
本段代码的filter转换算子的功能是过滤出以hi开头的内容,下面是运行结果
下面再介绍几个常用的算子分别是sample(转换算子),Action算子count、first、take、collect,还是先上一段代码
package com.debug;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;
public class UseRDD01 {
public static void main(String[] args) {
SparkConf conf=new SparkConf();
conf.setMaster("local");
conf.setAppName("WordCountApp");
JavaSparkContext sc=new JavaSparkContext(conf);
//读取字数统计txt文件
JavaRDD<String> lines=sc.textFile("/home/cry/word1.txt");
//其他transformation类型的RDD-sample
JavaRDD<String> sampleLs=lines.sample(false, 0.8);
sampleLs.foreach(new VoidFunction<String>() {
public void call(String line) throws Exception {
System.out.println(line);
}
});
//其他action类型的RDD
//long count=lines.count();
//System.out.println("总行数:"+count);
/*String firstLine=lines.first();
System.out.println("firstLine:"+firstLine);
List<String> arr=lines.take(2);
for (String line : arr) {
System.out.println("---"+line);
}*/
/*List<String> arr2=lines.collect();
for (String line : arr2) {
System.out.println("---"+line);
}*/
sc.stop();
}
}
count: 返回数据集中的元素个数
first:返回数据集中的第一个元素
take:以数组的形式返回数据集中的n个元素
collect:以数组的形式返回数据集中的所有元素
sample:从样本中取出部分数据
最后提供一篇其他人写的有关算子总结,可以参考下:
https://blog.youkuaiyun.com/fortuna_i/article/details/81170565