0%

源码分析之上下文构建

以ClassPathXmlApplicationContext为例来说明

1
ApplicationContext context = new ClassPathXmlApplicationContext("spring-lifecycle.xml");

一个简单地创建ApplicationContext实例的方法,spring会做什么事呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
// this(new String[] {configLocation}, true, null);
// refresh为true,parent为null
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {

super(parent);
// 为上下文设置配置文件的位置
setConfigLocations(configLocations);
if (refresh) {
// 调用org.springframework.context.support.AbstractApplicationContext#refresh,刷新上下文,进行IOC容器的初始化
refresh();
}
}

spring在初始化上下文的最重要的方法就是这个refresh()方法了

阅读全文 »

数据读取与保存

spark支持常见的如文本文件、json格式、csv格式、SequenceFiles格式(Hadoop的一种键值对数据)以及对象的序列化

如果是本地文件系统的话路径为file://开头,如果是hdfs文件系统为hdfs://开头

文本文件

1
2
3
4
5
// 读取
sc.textFile("file:///Users/zhanghe/Desktop/1.txt")

// 写入 lines是rdd
lines.saveAsTextFile("file:///Users/zhanghe/Desktop/2.txt")

JSON

使用JSON工具如fastJson、GSON、Jackson来操作字符串或对象来进行读取和写入

1
2
// 写入  mapper使用的是Jackson
lines.map(mapper.writeValueAsString(_)).saveAsTextFile(outputFile)
阅读全文 »

RDD编程

RDD的创建方式

从集合(内存)中创建RDD

使用parallelize或者makeRDD方法传入序列即可

1
2
3
4
5
6
7
8
9
// 准备集合
val list = List(1,2,3,4)
// 创建RDD
val rdd = context.parallelize(list)
// 该方法内部也是直接调用的parallelize(seq, numSlices)
context.makeRDD(list)
rdd.collect().foreach(println)

context.stop()
阅读全文 »

scala样例类

scala中的样例类是专门为模式匹配而创建的类,使用case来进行声明

1
case class HeartBeat(id:String)

样例类构造器中的参数都是默认为val修饰的,样例类会自动生成apply方法,unapply方法,toString方法,equals方法,hashCode方法,copy方法等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case class Teacher(id :Int)


val tea1 = Teacher(1)
val tea2 = Teacher(2)
val tea3 = Teacher(1)
val teaList = List(tea1,tea2,tea3)

for(tea <- teaList){
tea match {
case Teacher(1) => println(s"相同的老师${tea.id} ")
case _ => println(s"不是相同的老师${tea.id}")
}
}

scala视图

scala可以使用视图来进行懒加载操作,使得操作不会立即执行,只有使用到该结果时才会执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def even(num: Int): Boolean = {
println("开始过滤")
if (num % 2 == 0) {
true
} else {
false
}
}

val listInt: List[Int] = List(1, 2, 3)
// 使用view产生懒加载集合
val list2 = listInt.view.filter(even)
println("------")
// View(<not computed>)
println(list2)
// 只要真正使用的时候才会执行even方法
println(list2.size)