Spark编程进阶
SparkConf conf =new SparkConf().setMaster("local").setAppName("analysis");
JavaSparkContext sc =new JavaSparkContext(conf);
JavaRDD<String> rdd=sc.textFile("c:\\tests.txt");
final Accumulator<Integer> blankLines =sc.accumulator(0);
JavaRDD<String> callSigns = rdd.flatMap(
new FlatMapFunction<String, String>() {
public Iterable<String> call(String s) throws Exception {
if (s.equals(""))
blankLines.add(1);
return Arrays.asList(s.split(" "));
}
}
);
callSigns.saveAsTextFile("output.txt");
System.out.println("Blank Lines: "+blankLines.value());
//广播变量,每个的国家区号表final Broadcast<String[]> signPrefixes =sc.broadcast(loadCallSignTable());JavaPairRDD<String,Integer> countryContactCounts =contactCounts.mapToPair(new PairFunction<Tuple2<String,Integer>,String,Integer>(){public Tuple2<String,Integer> call<Tuple2<String,Integer>callSignCount){//获取区号前缀String sign=callSignCount._1();//获取该前缀,和广播变量比较,得到其对应的国家String country=lookupCountry(sign,signPrefixed.value());//将(电话,通信次数)转换为(国家,通信次数)PairRDDreturn new Tuple2(country,callSignCount._2());}}//针对同一个国家做归并,求每一个国家的通信次数之和).reduceByKey(new SumInts());//保存结果contryContactCounts.saveAsTextFile(outputDir+"/countrys.txt")
/*我们有一个在线的业余呼号数据库,可以用这个数据库查询日志中级路过的联系人呼号列表。可以通过基于分区的操作,在每个分区中共享一个数据库连接池*/JavaPairRDD<String,CallLog[]>contactsContactLists =validCallSigns.mapPartitionsToPair(new PairFlatMapFunction<Iterator<String>,String,CallLog[]>(){public Iterable<Tuple2<String,CallLog[]>> call(Iterator<String> input){ArrayList<Tuple2<String,CallLog[]>> callSignLogs =new ArrayList<Tuple2<String, CallLog[]>>();Arraylist<Tuple2<String,ContentExchange>> requests =new ArrayList<Tuple2<String,ContentExchange>>();ObjectMapper mapper=createMapper();HttpClient client =new HttpClient();try{client.start();while(input.hasNext()){requests.add(createRequestForSign(input.next(),client));}for(Tuple2<String,ContentExchange> signExchange :requests){callSignLogs.add(fetchResultFromRequest(mapper,signExchange));}}catch(Exception e){e.printStackTrace();}return callSignLogs;}});
| 函数名 | 调用所提供的 | 返回的 | 对于RDD[T]的函数签名 |
| mapPartitions() | 该分区中元素的迭代器 | 返回的元素的迭代器 | f:(Iteraotr[T]) -> Iterator[U] |
| mapPartitionsWithIndex() | 分区序号,以及每个分区中的元素迭代器 | 返回的元素的迭代器 | f:(Int,Iterator[T]) -> Iterator[U] |
| foreachPartitions() | 元素迭代器 | 无 | f:(Iterator[T]) ->Unit |
JavaRDD<Integer> rdd =sc.parallelize(Arrays.asList(1,2,3,4,5,6,7,8));
JavaRDD<Tuple2<Integer, Integer>> middle = rdd.mapPartitions(
new FlatMapFunction<Iterator<Integer>, Tuple2<Integer, Integer>>() {
public Iterable<Tuple2<Integer, Integer>> call(Iterator<Integer> integerIterator) throws Exception {
List<Tuple2<Integer,Integer>> list =new ArrayList<Tuple2<Integer, Integer>>();
int sum=0;
int num=0;
while(integerIterator.hasNext()){
sum+=integerIterator.next();
num++;
}
list.add(new Tuple2<Integer, Integer>(sum,num));//每个分区只创建了一次Tuple2对象
return list;
}
}
);
Tuple2<Integer, Integer> reduce = middle.reduce(
new Function2<Tuple2<Integer, Integer>, Tuple2<Integer, Integer>, Tuple2<Integer, Integer>>() {
public Tuple2<Integer, Integer> call(Tuple2<Integer, Integer> v1, Tuple2<Integer, Integer> v2) throws Exception {
return new Tuple2<Integer, Integer>(v1._1()+v2._1(),v1._2()+v2._2());
}
}
);
System.out.println("the average of the numbers is "+(double) reduce._1()/reduce._2());
| 方法 | 含义 |
| count() |
RDD中元素的个数 |
| mean() | 元素的平均值 |
| sum() | 总和 |
| max() | 最大值 |
| min() | 最小值 |
| variance() | 元素的方差 |
| sampleVariance() | 从采样中计算出的方差 |
| stdev() | 标准差 |
| sampleStdev() | 采样的标准差 |
List<Double> list =new ArrayList<Double>();
for(int i=0;i<10;i++){
list.add(i*1.0);
}
JavaDoubleRDD rdd =sc.parallelizeDoubles(list);
System.out.println("元素个数: "+rdd.count());
System.out.println("平均值: "+rdd.mean());
System.out.println("和: "+rdd.sum());
System.out.println("方差: "+rdd.variance());
System.out.println("标准差: "+rdd.stdev());
System.out.println("采样标准差: "+rdd.sampleStdev());
public class stat extends StatCounter {
public double cv(){
if(count()==0)
return Double.NaN;
return stdev()/mean();
}
public double cv_format_percent(){
//标明是无效数据,这种情况cv的值一定大于5%
if(count()==0)
return Double.POSITIVE_INFINITY;
return
Math.abs(100*cv());
}
}
/** Add a value into this StatCounter, updating the internal statistics. */def merge(value: Double): StatCounter = {//此处mu是平均值,m2是每个数与平均数的差的平方和val delta = value - mun += 1mu += delta / nm2 += delta * (value - mu)maxValue = math.max(maxValue, value)minValue = math.min(minValue, value)this}
Spark编程进阶的更多相关文章
- 《Spark快速大数据分析》—— 第六章 Spark编程进阶
这章讲述了Spark编程中的高级部分,比如累加器和广播等,以及分区和管道...
- Spark基础:(五)Spark编程进阶
共享变量 (1)累加器:是用来对信息进行聚合的,同时也是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变.累加器的一个常见用途是在调试时对作业执 ...
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- Spark学习之编程进阶总结(一)
一.简介 这次介绍前面没有提及的 Spark 编程的各种进阶特性,会介绍两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable).累加器用来对信息进行聚合 ...
- Scala进阶之路-idea下进行spark编程
Scala进阶之路-idea下进行spark编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.创建新模块并添加maven依赖 <?xml version=&qu ...
- Spark函数式编程进阶
函数式编程进阶 1.函数和变量一样作为Scala语言的一等公民,函数可以直接复制给变量: 2.函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,但是匿名函数赋值给 ...
- Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
/** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...
- Spark学习之编程进阶——累加器与广播(5)
Spark学习之编程进阶--累加器与广播(5) 1. Spark中两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable).累加器对信息进行聚合,而广播变 ...
- Scala函数式编程进阶
package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...
随机推荐
- WiresShark 一站式学习
按照国际惯例,从最基本的说起. 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接 ...
- 标准与扩展ACL实验
一标准访问控制列表实验: 实验拓扑: 实验目的:掌握标准与扩展ACL的配置 实验要求:拒绝R1到R3的所有流量 实验步骤: 步骤1 按如上拓扑做好底层配置,并检测相邻设备之间的连通性 步骤2起静态路由 ...
- 关于HTTP_CLIENT_IP,HTTP_X_FORWAR
HTTP_CLIENT_IP:可通过http头伪造HTTP_X_FORWARDED_FOR:可通过http头伪造REMOTE_ADDR:可能是用户真实IP也可能是代理IP 服务端获取IP地址 http ...
- Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
- 翻译的很好的一篇android mediaplayer
MediaPlayer类可用于控制音频/视频文件或流的播放.关于如何使用这个类的方法还可以阅读VideoView类的文档. 1.状态图对播放音频/视频文件和流的控制是通过一个状态机来管理的.下图显示一 ...
- js 增删改查
<html><head lang="en"> <meta charset="UTF-8"> <title>< ...
- Java IO整理
参考博客:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html Java IO体系结构 1.要弄清楚其体系结构,先明白 ...
- Android Quick Tip - ADB over WiFi
http://stuffandtech.blogspot.jp/2012/03/android-quick-tip-adb-over-wifi.html MAR 26 Android Quick ...
- 转 Could not create the view: An unexpected exception was thrown.问题解决
转自:http://blog.csdn.net/shuangzixing520/article/details/35225105 今天打开Myeclipse10的时候,发现server窗口出现一堆问题 ...
- Camera服务之--架构浅析
Camera服务之--架构浅析 分类: Camera 分析2011-12-22 11:17 7685人阅读 评论(3) 收藏 举报 android硬件驱动框架jnilinux内核平台 一.应用层 Ca ...