ArrayBuffer 长度可变的数组 使用前先导包 import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]()
使用+=操作符,添加元素
b+=(2,3,4)
使用++=,可以添加其他集合的元素
b ++= Array(6,7,8,9)
trimEnd() 从尾部截断指定个数的元素
insert(位置,元素) 从位置后一位可以插入元素,可以插入多个元素
toArray() toBuffer() 互相转换类型、
for循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。
Scala中for循环是有返回值的。如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是List,以此类推。
a.filter(_%2 ==0 ).map(2*_) 使用函数式编程转换数组
对immutableMap是不可以改变的,但是可以通过+,-生成新的Map实现
2018.10.27
1. scala的面向对象编程之对象
1.1 object,相当于一个class的单个实例,通常在里面放一些静态的field或者method
第一次调用object的方法时,会执行constructor,再次调用不会执行。且,object不能定义带参数的constructor
object通常用于作为单例模式的实现,或者放class的静态成员,比如工具方法等
1.2 伴生对象:如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类
伴生类和伴生对象,必须存放在一个.scala文件中, 且可以互相访问private field
def sayHello(name:String):Unit 表示只定义不实现
apply方法 :通常在伴生对象中实现apply方法,并在其中实现构造伴生类的对象的功能
比如 创建 val a = Array(1,2,3) 就不用 先new一个Array了,
2.scala的面向对象编程之继承
2.1 extends关键字,继承和java基本一致,
重写父类父类方法和字段: override def 方法名 ;override field
super 显示的指定调用父类的方法
2.2 isInstanceOf和asInstanceOf
将父类类型的变量强制转换成子类类型的变量。 先进行判断isInstanceOf 返回布尔值,然后在转换asInstanceOf
2.3 getClass和class()
2.4 protected 修饰父类的变量, 这样子类就可以直接调用了,而不需要super ; protected[this]修饰父类的变量,相当于private修饰
2.5 调用父类的constructor
如果是父类本身就有的参数,子类在继承父类,并调用父类的参数时,不用加val或者var。否则会被认为要覆盖父类的变量
2.6 匿名内部类 定义一个类的没有名称的子类,并直接创建其对象,然后将对象引用赋予一个变量
class Person(protected val name:String){
def sayHello = "Hello,I'm" + name
}
val p = new Person("leo"){
override def sayHello = "Hi ,I'm" + name
}
def greeting(p:Person{def sayHello: String}){
println(p.sayHello)
}
2.7 抽象field 父类中定义了field,但没有给出初始值,则为抽象field
子类必须覆盖field,以定义自己的具体field,并且覆盖field,不需要使用override关键字
3.trait
3.1 可以作为接口使用,类似java的接口, 使用关键字extends A with B(实现多个接口)
3.2 可以定义具体的方法,
3.3 定义具体的字段:如果是继承普通class获取的field,实际是定义在父类中,
继承trait获取的field,则是直接添加到子类中。
3.4 定义抽象的字段 继承了抽象字段(没有初始值即Wie抽象字段),继承完之后,必须要覆盖
3.5 为实例对象混入trait 即在定义对象时, val p = new Person() with MyLogger ------注:MyLogger是一个trait
3.6 trait调用链(实现了设计模式的责任链模式) 依次调用多个trait中的同一个方法,,只要让多个trait的同一个方法中,在最后都执行super.方法名 即可
调用多个trait时,首先从最右边的trait方法开始依次向左执行。
3.7 在trait中覆盖抽象方法 即 trait A extends B {如果要覆盖B的抽象方法,必须加abstract eg:abstract override def 方法名}
2018.11.2
1.spark基本原理 (RDD; 基于内存运算,少数基于磁盘; 迭代式计算)
1.1 RDD
①抽象式的分布式数据集合,可分区
②一个RDD逻辑上代表了一个HDFS文件,但是实际上是被分区的,分为多个分区,多个分区散落在spark集群中的多个集群上
③RDD通常通过Hadoop上的文件,即hdfs或hive表,进行创建;有时也可以通过应用程序中的集合进行创建
④RDD默认情况下存放在内存中,内存资源不足时,自动写入磁盘
⑤发现数据丢失后,spark会重新从数据源拿数据,重新计算
总结:分区,弹性存储,容错性
1.2 spark开发(底层都是RDD,我们做的是定义RDD,定义计算操作)
①离线批处理
②sql查询
③核心计算