原文引自:http://blog.sina.com.cn/s/blog_628cc2b70102w9up.html
一、初始化SparkContext
System.setProperty("hadoop.home.dir", "D:\\spark-1.6.1-bin-hadoop2.6\\spark-1.6.1-bin-hadoop2.6");
SparkConf conf = new SparkConf().setAppName("spark test1").setMaster("local[2]");
JavaSparkContext context = new JavaSparkContext(conf);
二、使用parallelize方法
创建RDD最简单的方式就是把程序中一个已有的集合传给SparkContext的parallelize()方法
JavaRDD lines = context.parallelize(Arrays.asList("pandas", "i like pandas"));
System.out.println(lines.collect());
输出:[pandas, i like pandas]
三、RDD操作(filter方法)
RDD支持两种操作:转化操作和行动操作。RDD的转化操作是返回一个新的RDD的操作,比如map()和filter(),而行动操作则是想驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算,比如count()和first()。
JavaRDD inputRDD = context.textFile("D:\\log\\521.txt");
JavaRDD errorsRDD = inputRDD.filter(
new Function(){
@Override
public Boolean call(String x) throws Exception {
// TODO Auto-generated method stub
return x.contains("error");
}
});
System.out.println("errors显示为:" + errorsRDD.collect());
System.out.println("errors个数为:" + errorsRDD.count());
其中521.log为android的logcat文件,里面包含很多错误信息。
四、使用lambda表达式
Java8 开始支持lambda表达式,可以简洁地实现函数接口。
JavaRDD inputRDD = context.textFile("D:\\log\\521.txt");
JavaRDD errors = inputRDD.filter(s -> s.contains("error"));
System.out.println(errors.count());
输出:23
五、使用map方法
将函数应用于RDD中的每个元素,将返回值构成新的RDD
JavaRDD rdd = context.parallelize(Arrays.asList(1, 3, 5, 7));
JavaRDD result = rdd.map(
new Function(){
@Override
public Integer call(Integer x) throws Exception {
// TODO Auto-generated method stub
return x * x;
}
});
System.out.println(StringUtils.join(result.collect(), ","));
输出:1,9,25,49
六、使用flatMap方法
将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD,通常用来切分单词。与map的区别是:这个函数返回的值是list的一个,去除原有的格式
JavaRDD lines = context.parallelize(Arrays.asList("hello world", "hi"));
JavaRDD words = lines.flatMap(
new FlatMapFunction(){
@Override
public Iterable call(String lines) throws Exception {
// TODO Auto-generated method stub
return Arrays.asList(lines.split(" "));
}
});
System.out.println(words.collect());
System.out.println(words.first());
输出:
[hello, world, hi]
hello
七、使用PairRDD方法
Spark为包含键值对类型的RDD提供了一些专有的操作,这些RDD称为pair RDD。当需要把一个普通的RDD转为pair RDD时,可以调用map()函数来实现。
JavaRDD lines = context.parallelize(Arrays.asList("hello world", "hangtian is from hangzhou", "hi", "hi"));
PairFunction keyData = new PairFunction(){
@Override
public Tuple2 call(String x) throws Exception {
// TODO Auto-generated method stub
return new Tuple2(x.split(" ")[0], x);
}
};
JavaPairRDD pairs = (JavaPairRDD) lines.mapToPair(keyData);
System.out.println(pairs.collect());
输出:[(hello,hello world), (hangtian,hangtian is from hangzhou), (hi,hi), (hi,hi)]
八、计算单词个数
JavaRDD input = context.textFile("D:\\test.txt");
JavaRDD words = input.flatMap(new FlatMapFunction(){
@Override
public Iterable call(String x) throws Exception {
// TODO Auto-generated method stub
return Arrays.asList(x.split(" "));
}
});
JavaPairRDD wordspair = words.mapToPair(new PairFunction(){
@Override
public Tuple2 call(String x) throws Exception {
// TODO Auto-generated method stub
return new Tuple2(x, 1);
}
});
JavaPairRDD result = wordspair.reduceByKey(new Function2(){
@Override
public Integer call(Integer x, Integer y) throws Exception {
// TODO Auto-generated method stub
return x + y;
}
});
System.out.println(result.sortByKey().collect());
输出:[(,2), (are,1), (can,1), (go,1), (i,2), (love,1), (me,1), (much,1), (ok?,1), (should,1), (so,2), (with,1), (you,3)]
九、使用Accumulator方法
Spark有两种共享变量:累加器 和 广播变量。累加器用来对信息进行聚合,而广播变量用来高效分发较大的对象。累加器提供了将工作节点中的值聚合到驱动器程序中国的简单语法。
JavaRDD rdd = context.textFile("D:\\test.txt");
final Accumulator blankLines = context.accumulator(0);
JavaRDD callSigns = rdd.flatMap(new FlatMapFunction(){
@Override
public Iterable call(String line) throws Exception {
// TODO Auto-generated method stub
if(line.equals("")){
blankLines.add(1);
}
return Arrays.asList(line.split(" "));
}
});
System.out.println(callSigns.collect());
System.out.println("Blank lines: " + blankLines.value());
输出:
[i, love, you, so, much, , so, i, should, you, can, go, with, me, , are, you, ok?]
Blank lines: 2
十、Spark SQL使用
Spark提供Spark SQL来操作结构化和半结构化数据。直白说就是,可以使用sql语句操作json和txt文件进行数据查询等操作。
JavaRDD rdd = context.textFile("D:\\test.json");
SQLContext sqlContext = SQLContext.getOrCreate(rdd.context());
DataFrame dataFrame = sqlContext.read().json(rdd);
dataFrame.registerTempTable("person");
DataFrame resultDataFrame = sqlContext.sql("select * from person where lovesPandas=true");
resultDataFrame.show(false);
输出:
+-----------+---------+
|lovesPandas|name |
+-----------+---------+
|true |nanchang |
|true |qier |
|true |kongshuai|
+-----------+---------+
十一、Spark Stream使用
用来实时计算数据,其构造函数接口用来指定多久时间处理一次新数据的批次间隔作为输入。以下代码在本地未能执行通过。设想是把netcat工具作为输入源,在程序中打印输入信息并进行处理
JavaStreamingContext jssc = new JavaStreamingContext(conf, new Duration(2000));
JavaDStream lines = jssc.socketTextStream("localhost", 7778);
lines.print();
jssc.start();
jssc.awaitTermination();
以上代码运行还需要删除最上面的context初始化的代码。
- spark 中的RDD编程 -以下基于Java api
1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...
- 在Windows的DOS中运行java编程中的问题
1.苦恼着我的就是找不到或无法加载主类!
- Java中的String字符串及其常用方法
字符串(String) 文章目录 字符串(String) 直接定义字符串 常用方法 字符串长度 toLowerCase() & toUpperCase()方法 trim()方法去除空格 判空 ...
- Java中的网络编程
Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...
- Java编程中“为了性能”尽量要做到的一些地方
最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...
- paip.提升性能--多核cpu中的java/.net/php/c++编程
paip.提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- java编程思想第四版中net.mindview.util包下载,及源码简单导入使用
在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...
- Java学习笔记(五)——google java编程风格指南(中)
[前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...
- 在myeclipse中使用Java语言进行spark Standalone模式应用程序开发
一.环境配置 Myeclipse中虽然已经集成了maven插件,但是由于这个插件版本较低,建立maven project会出现错误. 解决办法:自己到官网http://maven.apache.org ...
随机推荐
- Delphi操作ACCESS技巧集
1.DELPHI中操作access数据库(建立.mdb文件,压缩数据库)以下代码在WIN2K,D6,MDAC2.6下测试通过,编译好的程序在WIN98第二版无ACCESS环境下运行成功.//在之前us ...
- NX二次开发-测量投影距离
NXOPEN方法,直接录制测量投影距离命令 NX9+VS2012 #include <NXOpen/Annotations.hxx> #include <NXOpen/Assembl ...
- Java习题10.25
Java习题10.25 1. 实际上这道题考查的是两同两小一大原则: 方法名相同,参数类型相同 子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类 ...
- 笔试题-求小于等于N的数中有多少组素勾股数
题目描述: 一组勾股数满足:a2+b2=c2: 素勾股数:a,b,c彼此互质. 输入正整数N: 输出小于等于N的数中有多少组勾股数. 例: 输入:10 输出:1 思路:我是直接暴力破解的…… 首先找出 ...
- openstack nova 源码解析 — Nova API 执行过程从(novaclient到Action)
目录 目录 Nova API Nova API 的执行过程 novaclient 将 Commands 转换为标准的HTTP请求 PasteDeploy 将 HTTP 请求路由到具体的 WSGI Ap ...
- 关于JQuery Ajax 跨域 访问.net WebService
关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...
- 网页布局WEB标准的HTML结构化
您正在学习WEB标准CSS网页布局吗?是不是还不能完全掌握纯CSS布局?通常有两种需要您特别注意: 第一种可能是你还没有理解CSS处理页面的原理.在你考虑你的页面整体表现效果前,你应当先考虑内容的语义 ...
- Activiti学习笔记5 — 常用API解析
常用API解析: 一.ProcessEngineConfiguration 流程引擎配置对象(配置数据库连接4个大配置和建表策略) 二.ProcessEngine 流程引擎核心对象( ...
- iOS开发系列-Foundation与CoreFoundation内存管理
概述 对于初学者来说,可能仅只能将ARC用在objective-c对象上(也即继承自NSObject的对象),但是如果涉及到较为底层的东西,比如Core Foundation中的malloc()或者f ...
- 【noi.ac-CSP-S全国模拟赛第三场】#705. mmt
给定数组a[],b[] 求$$c_i=\sum_{j=1}^{i} a_{\left \lfloor \frac{n}{j} \right \rfloor}·b_{i \bmod j}$$ 大概就是对 ...