scala第一章

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查询
        ③核心计算
   

猜你喜欢

转载自blog.csdn.net/qq_33068519/article/details/83660941