Spark常用算子-value数据类型的算子
package com.test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
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.FlatMapFunction;
import org.apache.spark.api.java.function.Function; /**
* Value数据类型的Transformation算子
* @author FengZhen
*
*/
public class SparkValue { public static void main(String[] args){
//SparkConf conf = new SparkConf().setAppName(SparkValue.class.getName()).setMaster("local[2]");
SparkConf conf = new SparkConf().setAppName(SparkValueTest.class.getName());
JavaSparkContext sc = new JavaSparkContext(conf);
// 数据
JavaRDD<String> ds = sc.textFile("hdfs://bjqt/data/labeldata/datalabel.csv");
/**
* 一、输入分区与输出分区一对一型
* 1、map算子
* 2、flatMap算子
* 3、mapPartitions算子
* 4、glom算子
*/ /**
* 1.map算子
* 将原来 RDD 的每个数据项通过 map 中的用户自定义函数 f 映射转变为一个新的元素。
* 源码中 map 算子相当于初始化一个 RDD, 新 RDD 叫做 MappedRDD(this, sc.clean(f))。
*/
JavaRDD<String> nameRDD = ds.map(new Function<String, String>() {
private static final long serialVersionUID = 1L; @Override
public String call(String v1) throws Exception {
String[] values = v1.split(",");
return values[0];
}
});
List<String> nameList = nameRDD.collect();
System.out.println(nameList); /**
* 2.flatMap算子
* 将原来 RDD 中的每个元素通过函数 f 转换为新的元素,并将生成的 RDD 的每个集合中的元素合并为一个集合,
* 内部创建 FlatMappedRDD(this,sc.clean(f))。
*/
JavaRDD<String> flatMapRDD = ds.flatMap(new FlatMapFunction<String, String>() {
private static final long serialVersionUID = 1L; @Override
public Iterator<String> call(String t) throws Exception {
t = t.replace("‘", "");
String[] values = t.split(",");
List<String> result = Arrays.asList(values);
return result.iterator();
}
});
List<String> flatMapList = flatMapRDD.collect();
System.out.println(flatMapList); /**
* 3.mapPartitions算子
* mapPartitions 函 数 获 取 到 每 个 分 区 的 迭 代器,在 函 数 中 通 过 这 个 分 区 整 体 的 迭 代 器 对整 个 分 区 的 元 素 进 行 操 作。
* 内 部 实 现 是 生 成MapPartitionsRDD
* 做过滤
*/
JavaRDD<String> mapPartitionsRDD = nameRDD.mapPartitions(new FlatMapFunction<Iterator<String>, String>() {
private static final long serialVersionUID = 1L; @Override
public Iterator<String> call(Iterator<String> t) throws Exception {
List<String> nameList = new ArrayList<String>();
while (t.hasNext()) {
String name = (String) t.next();
if (name.startsWith("丁")) {
nameList.add(name);
}
}
return nameList.iterator();
}
});
List<String> mapPartitionsList = mapPartitionsRDD.collect();
System.out.println(mapPartitionsList); /**
* 4.glom算子
* glom函数将每个分区形成一个数组,内部实现是返回的GlommedRDD。
*/
JavaRDD<List<String>> glomRDD = nameRDD.glom();
List<List<String>> glomList = glomRDD.collect();
System.out.println(glomList); /**
* 二、输入分区与输出分区多对一型
* 5.union算子
* 6.cartesian算子
*/
/**
* 5.union算子
* 使用 union 函数时需要保证两个 RDD 元素的数据类型相同,返回的 RDD 数据类型和被合并的 RDD 元素数据类型相同,
* 并不进行去重操作,保存所有元素。如果想去重可以使用 distinct()。
* 同时 Spark 还提供更为简洁的使用 union 的 API,通过 ++ 符号相当于 union 函数操作。
*/
JavaRDD<String> mapPartitionsRDD1 = nameRDD.mapPartitions(new FlatMapFunction<Iterator<String>, String>() {
private static final long serialVersionUID = 1L; @Override
public Iterator<String> call(Iterator<String> t) throws Exception {
List<String> nameList = new ArrayList<String>();
while (t.hasNext()) {
String name = (String) t.next();
if (name.startsWith("王")) {
nameList.add(name);
}
}
return nameList.iterator();
}
});
JavaRDD<String> unionRDD = mapPartitionsRDD.union(mapPartitionsRDD1);
List<String> unionList = unionRDD.collect();
System.out.println(unionList); /**
* 6.cartesian算子
* 对两个RDD内 的 所 有 元 素 进 行 笛 卡 尔 积 操作。 操 作 后, 内 部 实 现 返 回CartesianRDD。
*/
JavaPairRDD<String, String> cartesianRDD = mapPartitionsRDD.cartesian(mapPartitionsRDD1);
Map<String, String> cartesianMap = cartesianRDD.collectAsMap();
System.out.println(cartesianMap); /**
* 三、输入分区与输出分区多对多型
* 7、grouBy算子
*/
/**
* 7.grouBy算子
* groupBy :将元素通过函数生成相应的 Key,数据就转化为 Key-Value 格式,之后将 Key 相同的元素分为一组。
函数实现如下:
1)将用户函数预处理:
val cleanF = sc.clean(f)
2)对数据 map 进行函数操作,最后再进行 groupByKey 分组操作。
this.map(t => (cleanF(t), t)).groupByKey(p)
其中, p 确定了分区个数和分区函数,也就决定了并行化的程度。
*/
JavaPairRDD<String, Iterable<String>> groupRDD = nameRDD.groupBy(new Function<String, String>() {
private static final long serialVersionUID = 1L; @Override
public String call(String v1) throws Exception {
return v1.substring(0, 1);
}
});
Map<String, Iterable<String>> groupMap = groupRDD.collectAsMap();
System.out.println(groupMap); /**
* 四、输出分区为输入分区子集型
* 8、filter算子
* 9、distinct算子
* 10、subtract算子
* 11、sample算子
* 12、takeSample算子
*/ /**
* 8.filter算子
* filter 函数功能是对元素进行过滤,对每个 元 素 应 用 f 函 数, 返 回 值 为 true 的 元 素 在RDD 中保留,返回值为 false 的元素将被过滤掉。
* 内 部 实 现 相 当 于 生 成 FilteredRDD(this,sc.clean(f))。
* 下面代码为函数的本质实现:
* deffilter(f:T=>Boolean):RDD[T]=newFilteredRDD(this,sc.clean(f))
*/
JavaRDD<String> filterRDD = nameRDD.filter(new Function<String, Boolean>() {
private static final long serialVersionUID = 1L; @Override
public Boolean call(String v1) throws Exception {
if (v1.contains("二")) {
return true;
}
return false;
}
});
List<String> filterMap = filterRDD.collect();
System.out.println(filterMap); /**
* 9.distinct算子
* distinct将RDD中的元素进行去重操作
*/
JavaRDD<String> repeatRDD = filterRDD.union(filterRDD);
List<String> repeatMap = repeatRDD.collect();
System.out.println(repeatMap);
JavaRDD<String> distinctRDD = repeatRDD.distinct();
List<String> distinctMap = distinctRDD.collect();
System.out.println(distinctMap); /**
* 10.subtract算子
* subtract相当于进行集合的差操作,RDD 1去除RDD 1和RDD 2交集中的所有元素
*/
JavaRDD<String> subRDD1 = nameRDD.filter(new Function<String, Boolean>() {
private static final long serialVersionUID = 1L; @Override
public Boolean call(String v1) throws Exception {
if (v1.contains("丁") || v1.contains("齐")) {
return true;
}
return false;
}
});
JavaRDD<String> subRDD2 = nameRDD.filter(new Function<String, Boolean>() {
private static final long serialVersionUID = 1L; @Override
public Boolean call(String v1) throws Exception {
if (v1.contains("丁")) {
return true;
}
return false;
}
});
JavaRDD<String> subtractRDD = subRDD1.subtract(subRDD2);
List<String> subtractList = subtractRDD.collect();
System.out.println(subtractList); /**
* 11.sample算子
* sample 将 RDD 这个集合内的元素进行采样,获取所有元素的子集。
* 用户可以设定是否有放回的抽样、百分比、随机种子,进而决定采样方式。
* 内部实现是生成 SampledRDD(withReplacement, fraction, seed)。
* 函数参数设置:
* ‰ withReplacement=true,表示有放回的抽样。
* ‰ withReplacement=false,表示无放回的抽样。
*/
JavaRDD<String> sampleRDD = nameRDD.sample(false, 0.01, 5);
List<String> sampleList = sampleRDD.collect();
System.out.println(sampleList); /**
* 12.takeSample算子
* takeSample()函数和上面的sample函数是一个原理,但是不使用相对比例采样,
* 而是按设定的采样个数进行采样,同时返回结果不再是RDD,而是相当于对采样后的数据进行Collect(),
* 返回结果的集合为单机的数组。
*/
List<String> takeSampleList = nameRDD.takeSample(false, 1, 5);
System.out.println(takeSampleList); sc.close();
}
}
Spark常用算子-value数据类型的算子的更多相关文章
- Spark常用算子-KeyValue数据类型的算子
package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...
- 08、Spark常用RDD变换
08.Spark常用RDD变换 8.1 概述 Spark RDD内部提供了很多变换操作,可以使用对数据的各种处理.同时,针对KV类型的操作,对应的方法封装在PairRDDFunctions trait ...
- spark 常用函数介绍(python)
以下是个人理解,一切以官网文档为准. http://spark.apache.org/docs/latest/api/python/pyspark.html 在开始之前,我先介绍一下,RDD是什么? ...
- 五十八、SAP中常用预定义数据类型
一.SAP中常用预定义数据类型 注意事项如下: 1.默认的定义数据类型是CHAR. 2.取值的时候C型默认从左取,N型从右取,超过定义长度则截断. 3.C类型,可以赋值数值,也可以赋值字符,还可以混合 ...
- Python列表介绍,最常用的Python数据类型
文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:数据杂论 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获 ...
- Databricks 第9篇:Spark SQL 基础(数据类型、NULL语义)
Spark SQL 支持多种数据类型,并兼容Python.Scala等语言的数据类型. 一,Spark SQL支持的数据类型 整数系列: BYTE, TINYINT:表示1B的有符号整数 SHORT, ...
- spark常用算子总结
算子分为value-transform, key-value-transform, action三种.f是输入给算子的函数,比如lambda x: x**2 常用算子: keys: 取pair rdd ...
- java实现spark常用算子之Union
import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...
- java实现spark常用算子之TakeSample
import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...
随机推荐
- eclipse中如何查看一个android模拟器的内部文件
eclipse中如何查看一个android模拟器的内部文件,有时要在其中添加一个文件夹或是什么的,要手动的做这件事,而不能够用代码去完成时,就要用这个方法了. 1.首先,打开一个安卓模拟器. 2.这个 ...
- 41、Android中当数据库需要更新时我们该怎么办?
转载 http://blog.csdn.net/jiangwei0910410003/article/details/39670813
- css 变手
用css 添加手状样式,鼠标移上去变小手,变小手 用css 添加手状样式,鼠标移上去变小手,变小手 cursor:pointer; 用JS使鼠标变小手onmouseover(鼠标越过的时候) onmo ...
- 一个fork的面试题——fork + 缓存区
update : 20140512 题目:请问下面的程序一共输出多少个“-”? #include <stdio.h> #include <sys/types.h> #inclu ...
- Jquery来对form表单提交(mvc方案)
来自:http://www.cnblogs.com/lmfeng/archive/2011/06/18/2084325.html 我先说明一下,这是asp.net mvc 里面的用法, Jquery来 ...
- 20160916-3:mysql主从复制
一.什么是主从复制 将一个数据库节点的数据拷贝到一个或多个数据库节点(主节点—>从节点) 二.主从复制的原理 [简述]:将主节点上的变更操作存储到binlog,从节点建立了到主节点的复制关系后, ...
- IOS 代码块
1.关系式表示 <returnType>(^BlockName)(list of arguments)=^(arguments){body;};
- getDomain(url)-我的JavaScript函数库-mazey.js
获取链接地址中域名,如mazey.net,www.mazey.net,m.mazey.net. 参数:url 必需function getDomain(url){ var a = documen ...
- IIS 6.0上部署.NET 4.0网站
最近需要把VS2010开发的网站部署到Windows Server 2003的服务器上去, Windows Server 2003操作系统自带的为IIS 6.0,IIS 6.0一般只支持.NET 2. ...
- ACM解题之(ZOJ 2724)Windows Message Queue
题目来源: 点击打开链接 题目翻译: 消息队列是windows系统的基本基础.对于每个进程,系统都维护一个消息队列.如果这个过程发生某些事情,例如鼠标点击,文本改变,系统会向队列添加一条消息.同时,如 ...