(九)groupByKey,reduceByKey,sortByKey算子-Java&Python版Spark

时间:2022-12-01 00:30:21

groupByKey,reduceByKey,sortByKey算子

视频教程:

1、优酷

2、 YouTube

1、groupByKey

groupByKey是对每个key进行合并操作,但只生成一个sequence,groupByKey本身不能自定义操作函数。

java:

 package com.bean.spark.trans;

 import java.util.Arrays;
import java.util.List; import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext; import scala.Tuple2; public class TraGroupByKey {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("union");
System.setProperty("hadoop.home.dir", "D:/tools/spark-2.0.0-bin-hadoop2.6");
JavaSparkContext sc = new JavaSparkContext(conf);
List<Tuple2<String, Integer>> list = Arrays.asList(new Tuple2<String, Integer>("cl1", 90),
new Tuple2<String, Integer>("cl2", 91),new Tuple2<String, Integer>("cl3", 97),
new Tuple2<String, Integer>("cl1", 96),new Tuple2<String, Integer>("cl1", 89),
new Tuple2<String, Integer>("cl3", 90),new Tuple2<String, Integer>("cl2", 60));
JavaPairRDD<String, Integer> listRDD = sc.parallelizePairs(list);
JavaPairRDD<String, Iterable<Integer>> results = listRDD.groupByKey();
System.out.println(results.collect());
sc.close();
}
}

python:

 # -*- coding:utf-8 -*-

 from pyspark import SparkConf
from pyspark import SparkContext
import os if __name__ == '__main__':
os.environ["SPARK_HOME"] = "D:/tools/spark-2.0.0-bin-hadoop2.6"
conf = SparkConf().setMaster('local').setAppName('group')
sc = SparkContext(conf=conf)
data = [('tom',90),('jerry',97),('luck',92),('tom',78),('luck',64),('jerry',50)]
rdd = sc.parallelize(data)
print rdd.groupByKey().map(lambda x: (x[0],list(x[1]))).collect()

注意:当采用groupByKey时,由于它不接收函数,spark只能先将所有的键值对都移动,这样的后果是集群节点之间的开销很大,导致传输延时。

整个过程如下:

(九)groupByKey,reduceByKey,sortByKey算子-Java&Python版Spark

因此,在对大数据进行复杂计算时,reduceByKey优于groupByKey。

另外,如果仅仅是group处理,那么以下函数应该优先于 groupByKey :

(1)、combineByKey 组合数据,但是组合之后的数据类型与输入时值的类型不一样。

(2)、foldByKey合并每一个 key 的所有值,在级联函数和“零值”中使用。

2、reduceByKey

对数据集key相同的值,都被使用指定的reduce函数聚合到一起。

java:

 package com.bean.spark.trans;

 import java.util.Arrays;
import java.util.List; import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2; import scala.Tuple2; public class TraReduceByKey {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("reduce");
System.setProperty("hadoop.home.dir", "D:/tools/spark-2.0.0-bin-hadoop2.6");
JavaSparkContext sc = new JavaSparkContext(conf);
List<Tuple2<String, Integer>> list = Arrays.asList(new Tuple2<String, Integer>("cl1", 90),
new Tuple2<String, Integer>("cl2", 91),new Tuple2<String, Integer>("cl3", 97),
new Tuple2<String, Integer>("cl1", 96),new Tuple2<String, Integer>("cl1", 89),
new Tuple2<String, Integer>("cl3", 90),new Tuple2<String, Integer>("cl2", 60));
JavaPairRDD<String, Integer> listRDD = sc.parallelizePairs(list);
JavaPairRDD<String, Integer> results = listRDD.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer s1, Integer s2) throws Exception {
// TODO Auto-generated method stub
return s1 + s2;
}
});
System.out.println(results.collect());
sc.close();
}
}

python:

 # -*- coding:utf-8 -*-

 from pyspark import SparkConf
from pyspark import SparkContext
import os
from operator import add
if __name__ == '__main__':
os.environ["SPARK_HOME"] = "D:/tools/spark-2.0.0-bin-hadoop2.6"
conf = SparkConf().setMaster('local').setAppName('reduce')
sc = SparkContext(conf=conf)
data = [('tom',90),('jerry',97),('luck',92),('tom',78),('luck',64),('jerry',50)]
rdd = sc.parallelize(data)
print rdd.reduceByKey(add).collect()
sc.close()

当采用reduceByKey时,Spark可以在每个分区移动数据之前将待输出数据与一个共用的key结合。 注意在数据对被搬移前同一机器上同样的key是怎样被组合的。

(九)groupByKey,reduceByKey,sortByKey算子-Java&Python版Spark

3、sortByKey

通过key进行排序。

java:

 package com.bean.spark.trans;

 import java.util.Arrays;
import java.util.List; import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext; import scala.Tuple2; public class TraSortByKey {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("sort");
System.setProperty("hadoop.home.dir", "D:/tools/spark-2.0.0-bin-hadoop2.6");
JavaSparkContext sc = new JavaSparkContext(conf);
List<Tuple2<Integer, String>> list = Arrays.asList(new Tuple2<Integer,String>(3,"Tom"),
new Tuple2<Integer,String>(2,"Jerry"),new Tuple2<Integer,String>(5,"Luck")
,new Tuple2<Integer,String>(1,"Spark"),new Tuple2<Integer,String>(4,"Storm"));
JavaPairRDD<Integer,String> rdd = sc.parallelizePairs(list);
JavaPairRDD<Integer, String> results = rdd.sortByKey(false);
System.out.println(results.collect());
sc.close()
}
}

python:

 #-*- coding:utf-8 -*-
if __name__ == '__main__':
os.environ["SPARK_HOME"] = "D:/tools/spark-2.0.0-bin-hadoop2.6"
conf = SparkConf().setMaster('local').setAppName('reduce')
sc = SparkContext(conf=conf)
data = [(5,90),(1,92),(3,50)]
rdd = sc.parallelize(data)
print rdd.sortByKey(False).collect()
sc.close()

(九)groupByKey,reduceByKey,sortByKey算子-Java&Python版Spark的更多相关文章

  1. (八)map,filter,flatMap算子-Java&amp&semi;Python版Spark

    map,filter,flatMap算子 视频教程: 1.优酷 2.YouTube 1.map map是将源JavaRDD的一个一个元素的传入call方法,并经过算法后一个一个的返回从而生成一个新的J ...

  2. (四)Spark集群搭建-Java&amp&semi;Python版Spark

    Spark集群搭建 视频教程 1.优酷 2.YouTube 安装scala环境 下载地址http://www.scala-lang.org/download/ 上传scala-2.10.5.tgz到m ...

  3. (七)Transformation和action详解-Java&amp&semi;Python版Spark

    Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...

  4. (一)Spark简介-Java&amp&semi;Python版Spark

    Spark简介 视频教程: 1.优酷 2.YouTube 简介: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月 ...

  5. (二)Spark-Linux环境准备-Java&amp&semi;Python版Spark

    Spark-Linux环境准备 视频教程: 1.优酷 2.YouTube 硬软件环境 1.虚拟机:VMware Workstation 12 2.虚拟机操作系统:RedHat5u4,单核,1G内存,2 ...

  6. (三)Spark-Hadoop集群搭建-Java&amp&semi;Python版Spark

    Spark-Hadoop集群搭建 视频教程: 1.优酷 2.YouTube 配置java 启动ftp [root@master ~]# /etc/init.d/vsftpd restart 关闭 vs ...

  7. (六)Spark-Eclipse开发环境WordCount-Java&amp&semi;Python版Spark

    Spark-Eclipse开发环境WordCount 视频教程: 1.优酷 2.YouTube 安装eclipse 解压eclipse-jee-mars-2-win32-x86_64.zip Java ...

  8. (五)什么是RDD-Java&amp&semi;Python版Spark

    什么是RDD 视频教程: 1.优酷 2.YouTube RDD是个抽象类,全称为Resilient Distributed Datasets,是一个容错的.并行的数据结构,可以让用户显式地将数据存储到 ...

  9. &lbrack;Python&plus;Java双语版自动化测试&lpar;接口测试&plus;Web&plus;App&plus;性能&plus;CICD&rpar;

    [Python+Java双语版自动化测试(接口测试+Web+App+性能+CICD)开学典礼](https://ke.qq.com/course/453802)**测试交流群:549376944**0 ...

随机推荐

  1. Python:设计模式介绍--单例模式

    单例模式 1.单例是只有一个实例2.通过静态字段+静态字段伪造出一个单例效果3.什么时候用:当所有实例中封装的数据相同时,创建单例模式(eg:连接池) 用单例模式创建连接池: class CP: __ ...

  2. Android开发之各个语言

    Android开发之各个语言 1.进行源码开发遇到一个最基础的问题就是各个语言下的字串翻译,所以我们必须得清楚res文件夹下各个资源文件夹 2.如图:

  3. InnoDB关键特性之change buffer

    一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...

  4. uva103 动态规划

    多维矩形嵌套,和二维的一模一样.判断能否嵌套时需要先排序. AC代码: #include<cstdio> #include<cstring> #include<algor ...

  5. iOS平台添加Google Admob -1&sol;2(Unity3D开发之七)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=567 Unity调用iOS还是非 ...

  6. 基于Cesium的demo赏析

    更新于2019.2.23 Cesium的强大不用多说,所以有很多*.组织基于cesium做了一些应用,其中不乏有很多优秀的示例,我们大都可以从中获得对自己的项目有益的东西.另:有的网站需要FQ. 官 ...

  7. 性能测试工具--SIEGE安装及使用简介 siege压力测试

    官方网站http://www.joedog.org/ 概述 Siege是一个多线程http负载测试和基准测试工具.它有3种操作模式: 1) Regression (when invoked by bo ...

  8. js倒计时发送验证码按钮

    var wait=60; function time(o) { if (wait == 0) { o.removeAttribute("disabled"); o.value=&q ...

  9. Zabbix实战-简易教程--业务类

    一.需求 项目要求对线上服务器进行监控,包括服务器本身状态.进程相关数据.业务相关数据. 服务器本身状态可以通过基础模板即可获取数据(CPU.内存.网络.磁盘): 进程相关数据,前面也有相关文章专门监 ...

  10. 动态计算UITableViewCell高度详解

    本文将介绍四种情况下UITableViewCell的计算方式,分别是: Auto Layout with UILabel in UITableViewCell Auto Layout with UIT ...