1.转化操作
转化操作是返回一个新的RDD的操作,我们可以使用filter()方法进行转化。举个使用scala进行转化操作的例子。
def main(args: Array[String]): Unit = { val conf = new SparkConf(); conf.setAppName("trans"); conf.setMaster("local"); //SparkContext对象代表对Spark集群的一个连接 val sc = new SparkContext (conf); val inputRdd = sc.textFile("E:\\file\\word.txt"); //转化操作 filter(),过滤出inputRdd中是"daijun"的字符串 val daijunRdd = inputRdd.filter(daijun => daijun.contains("daijun")); println(daijunRdd.countByValue()); }
其对应的Java代码如下:
public static void main(String[] args) { SparkConf conf = new SparkConf(); conf.setAppName("trans"); conf.setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> rdd = sc.textFile("E:\\file\\word.txt"); JavaRDD<String> daijunRdd = rdd.filter(new Function<String, Boolean>() { private static final long serialVersionUID = 1L; public Boolean call(String x) throws Exception { return x.contains("daijun"); } }); System.out.println(daijunRdd.countByValue().toString()); sc.close(); }
2.行动操作
行动操作时对RDD进行实际的计算的操作,产生实际的输出。在以上的基础上,举一个行动操作的例子,我们使用count()方法来取得我们想要的单词的个数。
scala代码:
def main(args: Array[String]): Unit = { val conf = new SparkConf(); conf.setAppName("trans"); conf.setMaster("local"); //SparkContext对象代表对Spark集群的一个连接 val sc = new SparkContext(conf); val inputRdd = sc.textFile("E:\\file\\word.txt"); //转化操作 filter(),过滤出inputRdd中是"daijun"的字符串 val daijunRdd = inputRdd.filter(daijun => daijun.contains("daijun")); //使用count()方法 返回计数结果 println(daijunRdd.count()); daijunRdd.take(2).foreach(println); }
Java代码
public static void main(String[] args) { SparkConf conf = new SparkConf(); conf.setAppName("trans"); conf.setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> rdd = sc.textFile("E:\\file\\word.txt"); //JavaRDD<String> daijunRdd = rdd.filter(s -> s.contains("daijun")); JavaRDD<String> daijunRdd = rdd.filter(new Function<String, Boolean>() { private static final long serialVersionUID = 1L; public Boolean call(String x) throws Exception { return x.contains("daijun"); } }); System.out.println(daijunRdd.count()); for(String line: daijunRdd.take(2)){ System.out.println(line); } sc.close(); }
note:在调用一个新的行动操作时,RDD都会从头计算,会使效率低下。要避免这种行为,可以将RDD持久化。
3.惰性求值
意思是在RDD进行行动操作之前Spark不会开始计算。在进行转化操作时,Spark会记录相关操作的信息,在需要时才会去执行它。