Spark中的各种action算子操作(java版)
在我看来,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版)的更多相关文章
- spark中产生shuffle的算子
Spark中产生shuffle的算子 作用 算子名 能否替换,由谁替换 去重 distinct() 不能 聚合 reduceByKey() groupByKey groupBy() groupByKe ...
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- spark 中的RDD编程 -以下基于Java api
1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...
- Spark中的键值对操作-scala
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- spark中map和mapPartitions算子的区别
区别: 1.map是对rdd中每一个元素进行操作 2.mapPartitions是对rdd中每个partition的迭代器进行操作 mapPartitions优点: 1.若是普通map,比如一个par ...
- Unity Game窗口中还原Scene窗口摄像机操作 强化版
之前写的那个版本看来真的是不行啊.最近研究了一下官方第一人称脚本,人家的平滑过渡真的是没得说.借鉴了一下,写出来了一个新的比较完美的控制. 之前我们的操作是通过鼠标输入的开始坐标和转动坐标.其实官方有 ...
- 操作系统中的几种调度算法(JAVA版)
import java.text.DecimalFormat; import java.util.Arrays; import java.util.Scanner; /* * 作者:Chensx102 ...
- python 中调用windows系统api操作剪贴版
# -*- coding: utf-8 -*- ''' Created on 2013-11-26 @author: Chengshaoling ''' import win32clipboard a ...
- 字符串中的空格替换问题(Java版)
解决方式一:时间复杂度为O(n^2) 解决方式二:时间复杂度为O(n) 代码实现: package string; public class SpaceStringReplace2 { //len为数 ...
随机推荐
- Dubbo入门到精通学习笔记(十七):FastDFS集群的安装、FastDFS集群的配置
文章目录 FastDFS集群的安装 FastDFS 介绍(参考:http://www.oschina.net/p/fastdfs) FastDFS 上传文件交互过程: FastDFS 下载文件交互过程 ...
- URAL 1748 The Most Complex Number
题目链接:https://vjudge.net/problem/11177 题目大意: 求小于等于 n 的最大反素数. 分析: n <= 10^18,而前20个素数的乘积早超过10^18,因此可 ...
- UVA - 10347 - Medians(由三中线求三角形面积)
AC代码: #include<cstdio> #include<cmath> #include<algorithm> #include<iostream> ...
- JPA安装配置
现在让我们继续安装JPA,如下几个步骤. 第一步:确认已经Java安装 首先,需要在系统上安装Java软件开发工具包(SDK).为了验证这一点,根据所使用的平台执行以下两个命令. 如果Java安装已正 ...
- 关于版本管理工具SVN
曾经使用过Git,但是目前使用的是相对简单的svn. 刚使用的时候,如果不出意外.会有同学配好环境与权限. 前端只需要将代码下载,修改,更新,与上传. 一 .下载 1.本地新建文件夹,作为本地仓库 命 ...
- 微信小程序开发之https服务器搭建三步曲
本篇文章主要讲述3个方面的内容,如下: 1.SSL证书的获取 2.服务器 Nginx SSL 证书的配置. 3.如何兼容80端口和443端口以及为什么要同时兼容这两个端口. 1.SSL证书的获取 ht ...
- js button禁用/启用
搬运自:https://blog.csdn.net/SonaEx/article/details/80879061 禁用: $("#id").attr("disabled ...
- 修改css样式+jq中的效果+属性操作+元素操作
:checked 选框选中的 一.修改css样式: 1.参数只写属性名,则返回属性值 $(this).css( ' color '); //300px 2.参数是属性名,属性值,逗号分隔,是 ...
- python_django_urls基础配置
url配置:请求地址与views函数的匹配 首先,指定根级url配置文件,默认为setting.py中的ROOT_URLCONF='项目名.urls'(俺们也不用去修改啥) 我们urls有两个,一个是 ...
- web storem破解
话不多说 直接跳地址 http://idea.lanyus.com/ 再加个附带汉化包,使用方法已经放在压缩包里面 网盘链接: https://pan.baidu.com/s/1aEA6SSbDuRg ...