在我看来,Spark编程中的action算子的作用就像一个触发器,用来触发之前的transformation算子。transformation操作具有懒加载的特性,你定义完操作之后并不会立即加载,只有当某个action的算子执行之后,前面所有的transformation算子才会全部执行。常用的action算子如下代码所列:(java版) 
package cn.spark.study.core;

import java.util.Arrays; 
import java.util.List; 
import java.util.Map;

import org.apache.spark.SparkConf; 
import org.apache.spark.api.java.JavaPairRDD; 
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.Function2;

import scala.Tuple2;

/** 
* action操作实战 
* @author dd 

*/ 
public class ActionOperation { 
public static void main(String[] args) { 
//reduceTest(); 
//collectTest(); 
//countTest(); 
//takeTest(); 
countByKeyTest(); 
}

 /**
* reduce算子
* 案例:求累加和
*/
private static void reduceTest(){
SparkConf conf = new SparkConf()
.setAppName("reduce")
.setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf); List<Integer> numberList = Arrays.asList(1,2,3,4,5,6,7,8,9,10); JavaRDD<Integer> numbersRDD = sc.parallelize(numberList); //使用reduce操作对集合中的数字进行累加
int sum = numbersRDD.reduce(new Function2<Integer, Integer, Integer>() { @Override
public Integer call(Integer arg0, Integer arg1) throws Exception {
return arg0+arg1;
}
}); System.out.println(sum); sc.close();
} /**
* collect算子
* 可以将集群上的数据拉取到本地进行遍历(不推荐使用)
*/
private static void collectTest(){
SparkConf conf = new SparkConf()
.setAppName("collect")
.setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf); List<Integer> numberList = Arrays.asList(1,2,3,4,5,6,7,8,9,10); JavaRDD<Integer> numbersRDD = sc.parallelize(numberList); JavaRDD<Integer> doubleNumbers = numbersRDD.map(new Function<Integer, Integer>() { @Override
public Integer call(Integer arg0) throws Exception {
// TODO Auto-generated method stub
return arg0*2;
}
}); //foreach的action操作是在远程集群上遍历rdd中的元素,而collect操作是将在分布式集群上的rdd
//数据拉取到本地,这种方式一般不建议使用,因为如果rdd中的数据量较大的话,比如超过一万条,那么性能会
//比较差,因为要从远程走大量的网络传输,将数据获取到本地,有时还可能发生oom异常,内存溢出
//所以还是推荐使用foreach操作来对最终的rdd进行处理
List<Integer> doubleNumList = doubleNumbers.collect();
for(Integer num : doubleNumList){
System.out.println(num);
}
sc.close();
} /**
* count算子
* 可以统计rdd中的元素个数
*/
private static void countTest(){
SparkConf conf = new SparkConf()
.setAppName("count")
.setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf); List<Integer> numberList = Arrays.asList(1,2,3,4,5,6,7,8,9,10); JavaRDD<Integer> numbersRDD = sc.parallelize(numberList); //对rdd使用count操作统计rdd中元素的个数
long count = numbersRDD.count();
System.out.println(count); sc.close();
} /**
* take算子
* 将远程rdd的前n个数据拉取到本地
*/
private static void takeTest(){
SparkConf conf = new SparkConf()
.setAppName("take")
.setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf); List<Integer> numberList = Arrays.asList(1,2,3,4,5,6,7,8,9,10); JavaRDD<Integer> numbersRDD = sc.parallelize(numberList); //take操作与collect操作类似,也是从远程集群上获取rdd数据,但是,collect操作获取的是rdd的
//所有数据,take获取的只是前n个数据
List<Integer> top3number = numbersRDD.take(3);
for(Integer num : top3number){
System.out.println(num);
}
sc.close();
} /**
* saveAsTextFile算子
*
*/
private static void saveAsTExtFileTest(){
SparkConf conf = new SparkConf()
.setAppName("saveAsTextFile"); JavaSparkContext sc = new JavaSparkContext(conf); List<Integer> numberList = Arrays.asList(1,2,3,4,5,6,7,8,9,10); JavaRDD<Integer> numbersRDD = sc.parallelize(numberList); JavaRDD<Integer> doubleNumbers = numbersRDD.map(new Function<Integer, Integer>() { @Override
public Integer call(Integer arg0) throws Exception {
// TODO Auto-generated method stub
return arg0*2;
}
}); //saveAsTextFile算子可以直接将rdd中的数据保存在hdfs中
//但是我们在这里只能指定保存的文件夹也就是目录,那么实际上,会保存为目录中的
// /double_number.txt/part-00000文件
doubleNumbers.saveAsTextFile("hdfs://spark1:9000/double_number.txt"); sc.close();
} /**
* countByKey算子
*/ private static void countByKeyTest(){
SparkConf conf = new SparkConf()
.setAppName("take")
.setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf); List<Tuple2<String, String>> studentsList = Arrays.asList(
new Tuple2<String, String>("class1","leo"),
new Tuple2<String, String>("class2","jack"),
new Tuple2<String, String>("class1","marry"),
new Tuple2<String, String>("class2","tom"),
new Tuple2<String, String>("class2","david")); JavaPairRDD<String, String> studentsRDD = sc.parallelizePairs(studentsList); //countByKey算子可以统计每个key对应元素的个数
//countByKey返回的类型直接就是Map<String,Object> Map<String, Object> studentsCounts = studentsRDD.countByKey(); for(Map.Entry<String, Object> studentsCount : studentsCounts.entrySet()){
System.out.println(studentsCount.getKey()+" : "+studentsCount.getValue());
}
sc.close();
}

原文引自:http://blog.csdn.net/kongshuchen/article/details/51344124

Spark中的各种action算子操作(java版)的更多相关文章

  1. spark中产生shuffle的算子

    Spark中产生shuffle的算子 作用 算子名 能否替换,由谁替换 去重 distinct() 不能 聚合 reduceByKey() groupByKey groupBy() groupByKe ...

  2. Spark中的键值对操作

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  3. spark 中的RDD编程 -以下基于Java api

    1.RDD介绍:     RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...

  4. Spark中的键值对操作-scala

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  5. spark中map和mapPartitions算子的区别

    区别: 1.map是对rdd中每一个元素进行操作 2.mapPartitions是对rdd中每个partition的迭代器进行操作 mapPartitions优点: 1.若是普通map,比如一个par ...

  6. Unity Game窗口中还原Scene窗口摄像机操作 强化版

    之前写的那个版本看来真的是不行啊.最近研究了一下官方第一人称脚本,人家的平滑过渡真的是没得说.借鉴了一下,写出来了一个新的比较完美的控制. 之前我们的操作是通过鼠标输入的开始坐标和转动坐标.其实官方有 ...

  7. 操作系统中的几种调度算法(JAVA版)

    import java.text.DecimalFormat; import java.util.Arrays; import java.util.Scanner; /* * 作者:Chensx102 ...

  8. python 中调用windows系统api操作剪贴版

    # -*- coding: utf-8 -*- ''' Created on 2013-11-26 @author: Chengshaoling ''' import win32clipboard a ...

  9. 字符串中的空格替换问题(Java版)

    解决方式一:时间复杂度为O(n^2) 解决方式二:时间复杂度为O(n) 代码实现: package string; public class SpaceStringReplace2 { //len为数 ...

随机推荐

  1. Dubbo入门到精通学习笔记(十七):FastDFS集群的安装、FastDFS集群的配置

    文章目录 FastDFS集群的安装 FastDFS 介绍(参考:http://www.oschina.net/p/fastdfs) FastDFS 上传文件交互过程: FastDFS 下载文件交互过程 ...

  2. URAL 1748 The Most Complex Number

    题目链接:https://vjudge.net/problem/11177 题目大意: 求小于等于 n 的最大反素数. 分析: n <= 10^18,而前20个素数的乘积早超过10^18,因此可 ...

  3. UVA - 10347 - Medians(由三中线求三角形面积)

    AC代码: #include<cstdio> #include<cmath> #include<algorithm> #include<iostream> ...

  4. JPA安装配置

    现在让我们继续安装JPA,如下几个步骤. 第一步:确认已经Java安装 首先,需要在系统上安装Java软件开发工具包(SDK).为了验证这一点,根据所使用的平台执行以下两个命令. 如果Java安装已正 ...

  5. 关于版本管理工具SVN

    曾经使用过Git,但是目前使用的是相对简单的svn. 刚使用的时候,如果不出意外.会有同学配好环境与权限. 前端只需要将代码下载,修改,更新,与上传. 一 .下载 1.本地新建文件夹,作为本地仓库 命 ...

  6. 微信小程序开发之https服务器搭建三步曲

    本篇文章主要讲述3个方面的内容,如下: 1.SSL证书的获取 2.服务器 Nginx SSL 证书的配置. 3.如何兼容80端口和443端口以及为什么要同时兼容这两个端口. 1.SSL证书的获取 ht ...

  7. js button禁用/启用

    搬运自:https://blog.csdn.net/SonaEx/article/details/80879061 禁用: $("#id").attr("disabled ...

  8. 修改css样式+jq中的效果+属性操作+元素操作

    :checked    选框选中的 一.修改css样式: 1.参数只写属性名,则返回属性值 $(this).css( ' color ');   //300px 2.参数是属性名,属性值,逗号分隔,是 ...

  9. python_django_urls基础配置

    url配置:请求地址与views函数的匹配 首先,指定根级url配置文件,默认为setting.py中的ROOT_URLCONF='项目名.urls'(俺们也不用去修改啥) 我们urls有两个,一个是 ...

  10. web storem破解

    话不多说 直接跳地址 http://idea.lanyus.com/ 再加个附带汉化包,使用方法已经放在压缩包里面 网盘链接: https://pan.baidu.com/s/1aEA6SSbDuRg ...