窄依赖就是一个父RDD分区对应一个子RDD分区,如map,filter 或者多个父RDD分区对应一个子RDD分区,如co-partioned join 宽依赖是一个父RDD分区对应非全部的子RDD分区...,如groupByKey,ruduceByKey 或者一个父RDD分区对应全部的子RDD分区,如未经协同划分的join https://www.jianshu.com/p/736a4e628f0f...不可以(java8开始支持接口中允许写方法实现代码了),这样看起来trait又很像抽象类 18、Scala 语法中to 和 until有啥区别 to 包含上界,until不包含上界 19、讲解Scala...伴生对象和伴生类 单例对象与类同名时,这个单例对象被称为这个类的伴生对象,而这个类被称为这个单例对象的伴生类。...伴生类和伴生对象要在同一个源文件中定义,伴生对象和伴生类可以互相访问其私有成员。不与伴生类同名的单例对象称为孤立对象。
4、父包要访问子包的内容时,需要import 对应的子包中的类。...包对象的名字需要和子包一样 // 5. 在包对象中可以定义变量,方法 // 6. 在包对象中定义的变量和方法,就可以在对应的包中使用 // 7. ...你需要在父包(com.atguigu)中定义它,且名称与子包一样。 ...示例代码如下: package com.atguigu.chapter07.myextends // 说明: // 1、在 Scala 中,子类继承了父类的所有属性,但是父类的 private 的属性和方法无法访问... // 1、因为 scala 遵守先构建父类部分 extends Person600(),由父类的辅助构造器调用该父类的带参主构造器 // 2、Person... // 3、Emp
主要是 RDD 间的父子依赖关系。 变换函数(compute function)。作用于分区上的变换函数,可以由几个父分区计算得到一个子分区。 分区模式(partition scheme)。...因为涉及到的父分区相对较少,并且可以并行恢复。而对于宽依赖,由于依赖复杂(如上图,子 RDD 的每个分区都会依赖父 RDD 的所有分区),一个分区的丢失可能就会引起全盘的重新计算。...().x) 为了让 Scala 解释器能在分布式环境运行,我们在 Spark 中对其进行了以下修改: 类代码传输(Class shipping):为了让工作节点(Worker Nodes)可以拉取驱动节点...(Driver Node)上解释器用户输入编译成的字节码,我们让解释器可以通过 HTTP 将每个类的访问开放出来。...代码生成修改(Modified code generation):Scala 解释器在处理不同行的访问时,会通过一个静态方法来获取其初始化后单例,进而访问上一行的变量 Line.x。
树 数的定义 专业定义: 有且只有一个根的节点 有若干的互不相交的子树,这些子树本身也是一棵树 通俗的定义: 树是由节点和边组成 每个节点只有一个父节点,但可以有多个子结点 但有一个节点例外,该节点没有父节点...专业术语: 节点 父节点 子节点 子孙 祖先 堂兄弟 深度:从根节点到最底层节点的层数。...森林 n 个互不相交的树的集合 树的存储 二叉树的存储 连续存储[完全二叉树] 优点: 查找某个节点的父节点和子结点速度(也包括有没有子结点)很快. 缺点: 耗用的内存空间比较大....链式存储 一般树的存储 双亲表示法 求父节点方便。 孩子表示法 求子节点方便。 双亲孩子表示法 求父节点和子结点都很方便。 二叉树表示法 把一个普通的树转换成二叉树来存储。...操作系统子父进程的关系本身就是一棵树。
与创建一个“独立的(freestanding)” Actor 不同,这会将新 Actor 作为一个子节点注入到已经存在的树中:创建 Actor 的 Actor 成为新创建的子 Actor 的父级。...你可能会问,你创造的第一个 Actor 的父节点是谁? 如下图所示,所有的 Actors 都有一个共同的父节点,即用户监督者(the user guardian)。...每当一个 Actor 被停止时,它的所有子 Actor 也会被递归地停止。这种行为大大简化了资源清理,并有助于避免诸如由打开的套接字和文件引起的资源泄漏。...这个顺序是严格的,在调用父 Actor 的postStop()钩子之前,会先调用所有子 Actor 的postStop()钩子。...这样,父 Actor 就可以作为子 Actor 的监督者(supervisors)。默认的监督策略是停止并重新启动子 Actor。如果不更改默认策略,所有失败都会导致重新启动。
,不同类型的数据由不同的RDD类抽象表示,不同的操作也由RDD进行抽实现。...Lineage(血统) 利用内存加快数据加载,在众多的其它的In-Memory类数据库或Cache类系统中也有实现,Spark的主要区别在于它处理分布式运算环境下的数据容错性(节点实效/数据丢失)问题时采用的方案...Narrow Dependencies是指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区或多个父RDD的分区对应于一个子RDD的分区,也就是说一个父RDD...Wide Dependencies是指子RDD的分区依赖于父RDD的多个分区或所有分区,也就是说存在一个父RDD的一个分区对应一个子RDD的多个分区。...对与Wide Dependencies,这种计算的输入和输出在不同的节点上,lineage方法对与输入节点完好,而输出节点宕机时,通过重新计算,这种情况下,这种方法容错是有效的,否则无效,因为无法重试,
一、Scala中的包管理 基本语法 package + 包名 包管理的作用 区分相同名字的类 当类很多时,可以很好的管理类 控制访问范围 ---- 包的命名 命名规则:只能包含数字、字母、下划线、小圆点...: 一个源文件中可以声明多个 package 子包中的类可以直接访问父包中的内容,而无需导包 包对象 定义包对象: package object 包名{ // 代码块 } Scala 中可以为每个包定义一个同名的包对象...定义当前包共享的属性和方法。 必须为同一个包下面的单例对象或者类才能访问到 导入包 import java.util._ 导入包 util中的所有成员 import java.util....访问权限 Java 中,访问权限分为:public,private,protected 和默认 Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字,不用显式声明...class 子类名 extends 父类名 { 类体 } 子类继承父类的属性和方法。 Scala和Java一样都是单继承的。 继承的调用顺序,父类为先,子类在后。
伴生对象与伴生类 伴生对象与伴生类在Scala的面向对象编程方法中占据极其重要的位置,例如Scala中许多工具方法都是由伴 生对象提供的。...伴生类和伴生对象间可以相互访问对方的 private字段和方法。 接下来看一个伴生类和伴生对象的例子(Person. scala)。 ?...; 每个类都可以有伴生对象,伴生类与伴生对象写在同一个文件中; 在伴生类中,可以访问伴生对象的private字段Person.uniqueSkill; 而在伴生对象中,也可以访问伴生类的private方法...该调用不是对父类的调用,而是对其左边混入的Trait的调用,如果到左边第一个,就是调用Programmer抽象类的getSkill()方法。...,交换的消息存放在接收方的邮箱中;actor可以有父子关系,父actor可以监管子actor,子actor唯一的监管者就是父actor; 一个actor就是一个容器,它包含了状态、行为、一个邮箱(邮箱用来接受消息
尽管 Spark 没有给出显示控制每个键具体落在哪一个工作节点上的方法(部分原因是Spark 即使在某些节点失败时依然可以工作),但 Spark 可以确保同一分区的键出现在同一个节点上。...该应用会周期性地将这张表与一个小文件进行组合,这个小文件中存着过去五分钟内发生的事件——其实就是一个由 (UserID, LinkInfo) 对组成的表,存放着过去五分钟内某网站各用户的访问情况。...它会返回一个 scala.Option 对象,这是 Scala 中用来存放可能存在的对象的容器类。...可以使用自定义的分区器来实现仅根据域名而不是整个 URL 来分区。...Scala中: 要实现自定义的分区器,你需要继承 org.apache.spark.Partitioner类并实现下面三个方法: numPartitions: Int :返回创建出来的分区数。
窄依赖是指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区或多个父RDD的分区对应于一个子RDD的分区,也就是说一个父RDD的一个分区不可能对应一个子RDD...宽依赖是指子RDD的分区依赖于父RDD的多个分区或所有分区,即存在一个父RDD的一个分区对应一个子RDD的多个分区。...依赖关系的特性 第一,窄依赖可以在某个计算节点上直接通过计算父RDD的某块数据计算得到子RDD对应的某块数据;宽依赖则要等到父RDD所有数据都计算完成之后,并且父RDD的计算结果进行hash并传到对应节点上之后才能计算子...广播变量,是一个只读对象,在所有节点上都有一份缓存,创建方法是 SparkContext.broadcast()。创建之后再更新它的值是没有意义的,一般用 val 来修改定义。...自己调用 foreach 去 append: Spark Streaming 提供的 foreach 这个 outout 类 api (一种 Action 操作),可以让我们自定义输出计算结果的方法。
2.3 编程模型 在Spark中,RDD被表示为对象,通过这些对象上的方法(或函数)调用转换。 定义RDD之后,程序员就可以在动作(注:即action操作)中使用RDD了。...我们发现RDD之间的依赖关系可以分为两类,即:(1)窄依赖(narrow dependencies):子RDD的每个分区依赖于常数个父分区(即与数据规模无关);(2)宽依赖(wide dependencies...):子RDD的每个分区依赖于所有父RDD分区。...首先,窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区。...第二,窄依赖能够更有效地进行失效节点的恢复,即只需重新计算丢失RDD分区的父分区,而且不同节点之间可以并行计算;而对于一个宽依赖关系的Lineage图,单个节点失效可能导致这个RDD的所有祖先丢失部分分区
对边界塌陷的理解 边界塌陷的概念: 父元素包裹子元素,给子元素设置margin-top,只想让子元素距离父元素边框有一段距离,而却出现了父元素的顶端距离body这个边框出现了位移 边界塌陷的解决办法 给父元素加边框...造成性能损失:闭包涉及跨作用域的访问,所以会导致性能损失,解决办法:涉及到跨作用域的变量,定义为局部变量,减轻对性能的影响。...面向对象的三大特征 封装:把一种事物的方法和属性封装到对象中 继承:子对象可以继承父对象的属性和方法 多态:同一个方法,自定义和父定义的内容不同 面向对象编程的优势 易维护,易复用,效率高,易扩展(耦合性比较低...ES6中的面向对象 class定义类 static静态属性 constructor方法,通过new命令生成对象实例时,自动调用该方法 super父类构造函数 extends继承关键字 对设计模式的理解...,实例是子类的实例,也是父类的实例2、类新增原型方法和属性,子类都能访问到3、简单,易于实现 缺点:1、因为原型对象的属性是共享的,修改一个对象属性,其他对象的该属性也变了2、创建子类实例时,无法向父类构造函数传递参数
1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User...,在类的方法中,可以直接访问类的其他对象的private field;这种情况下,如果不希望field被其他对象访问到,那么可以使用private[this],意味着对象私有的field,只有本对象内可以访问到...此外,在子类覆盖父类方法以后,如果我们在子类中就要调用父类的被覆盖的方法呢?那就可以使用super关键字,现实的指定要调用父类的方法。 ...: Scala中的trait可以不是只定义抽象方法,还可以定义具体方法,此时trait更像是包含了通用工具方法的东西,有一个专有的名词来形容这种情况,就是说trait的功能混入了类。...但是覆盖时,如果使用了super.方法的代码,则无法通过编译。因为super.方法就会去掉用父trait的抽象方法,此时子trait的该方法还是会被认为是抽象的。
因为子线程thread里面调用get方法时当前线程为thread线程,而这里调用set方法设置的变量时main线程,两者是不同线程,自然子线程访问时放回null。...那么有没有办法让子线程能访问到父线程中的值,当然是有的哈哈哈! InheritableThreadLocal 为了解决上节提出的问题,InheritableThreadLocal应运而生。...InheritableThreadLocal继承自ThreadLocal,其提供了一个特性,就是让子线程可以访问在父线程中设置的本地变量。...下面我们看一下重写的代码 (1) 何时执行,以及如何让子线程可以访问到父线程的本地变量。这要从创建Thread的代码说去,打开Thread类的默认构造函数,代码如下。...其实子线程使用父线程中的threadLocal方法由多种方式,比如创建线程时传入父线程中的变量,并将其复制到子线程中,或者在父线程中构造一个map作为参数传递给子线程,但是这些都改变了我们的使用习惯,所以在这些情况下
leo.name: String = your name isleo 仅暴露field的getter方法 scala> :paste // Entering paste mode (ctrl-D to...2 让object继承抽象类 object的功能其实和class类似,除了不能定义接收参数的constructor之外 object也可以继承抽象类,并覆盖抽象类中的方法 scala> :paste /...,则必须使用override关键字 override关键字可以帮组我们尽早的发现代码里的错误,覆写方法错了就会报错 在子类覆盖父类方法之后,如果我们在子类中就是要调用父类的被覆盖的方法,那就可以使用super...和method,在子类中就不需要super关键字,直接就可以访问field和method 还可以使用protected[this],则只能在当前子类对象中访问父类的field和method,无法通过其他子类对象访问父类的...,为var或val类型的field生成对应的getter和setter方法,但是父类中没有该field的 子类必须覆盖field,以定义自己的具体field,并且覆盖抽象field,不需要使用override
使用get/set 不就是用来访问和操作私有属性的吗? 使用 @BeanProperty 居然还必须时 public 那么定义该注解的有何用? 如下:不使用 get/set 可以进行操作。...子类可以重写父类的方法 scala中的继承 语法: class 类名[(参数列表)] extends 父类名[参数列表] 特性: 使用 extends 关键字用于继承 同java一致,scala...在scala 中重写父类中的方法,需要使用 override 关键字修饰。...父类中的属性是必须定义成 val ,不能使用private 修饰。 重写属性和重写方法一样,都会用到 override 关键字。...没有哪个程序员会是某垃圾的粉丝吧。 ---- 调用父类中的方法 在java中若要调用父类中的 方法,会使用supper 关键字,在scala中也是一样。
四,语法规则 1,标识符 标识符由字母和数字组成,遵循驼峰命名规则。 类的名称以大写字母开头。 方法的名称以小写字母开头。 变量的名称以小写字母开头。 ? 2,注释 单行注释用//开头。...类的定义中可以用public声明为公有属性和公有方法,在类的内部和外部都可以被访问。 可以用private声明为私有属性和私有方法,只允许在类的作用域访问,不允许在类的外部访问。...可以用protected声明为受保护的属性和方法,只允许在类作用域及其子类作用域中访问。 不使用作用域关键字声明的属性和方法默认为为package作用域,在同一个package中的类可以访问。 ?...2,访问属性 Field getField(name):根据字段名获取某个public的field(包括父类) Field getDeclaredField(name):根据字段名获取当前类的某个field...Java中有3中不同的注解: SOURCE类型的注解由编译器使用,在编译期被丢掉了,如@Override; CLASS类型的注解仅保存在class文件中,这类注解只被一些底层库使用,它们不会被加载进JVM
根据上节的介绍,这应该是正常现象。因为子线程thread里面调用get方法时当前线程为thread线程,而这里调用set方法设置的变量时main线程,两者是不同线程,自然子线程访问时放回null。...那么有没有办法让子线程能访问到父线程中的值,当然是有的哈哈哈! InheritableThreadLocal 为了解决上节提出的问题,InheritableThreadLocal应运而生。...InheritableThreadLocal继承自ThreadLocal,其提供了一个特性,就是让子线程可以访问在父线程中设置的本地变量。...下面我们看一下重写的代码 (1) 何时执行,以及如何让子线程可以访问到父线程的本地变量。这要从创建Thread的代码说去,打开Thread类的默认构造函数,代码如下。...其实子线程使用父线程中的threadLocal方法由多种方式,比如创建线程时传入父线程中的变量,并将其复制到子线程中,或者在父线程中构造一个map作为参数传递给子线程,但是这些都改变了我们的使用习惯,所以在这些情况下
> 三:scala面向对象编程 (*)scala的类的定义 复习:面向对象的基本概念 1)定义:把数据和操作数据的方法放到一起,作为一个整体(类class...2)继承就代表,子类可以从父类继承父类的field和method,然后子类可以在自己内部放入父类所没有,子类特有的filed和method,使用继承可以复用代码 3)子类可以覆盖父类的...5)子类中的属性val要覆盖父类中的属性,必须写override(参见nameVal) 6)父类中的变量不可以覆盖(参见nameVar) 4)定义抽象类 ...特征:相当于Java中的接口,实际上他比接口功能强大. 2)与接口不同的是:是可以定义属性和方法的实现 3)一般情况下scala的类只能被继承单一父类,但是如果是trait...这是类型下界的定义,也就是U必须是类型T的父类(或者本身,自己也可以认为自己是自己的父类) (lower bound) 等同于 java中的<T super Comparable
中的接口非常类似 在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可 类可以使用extends关键字继承trait,注意,这里不是implement,而是extends...就想trait的功能混入了类 举例来说,trait中可以包含一些很多类都通用的功能方法,比如打印日志等等,spark中就使用了trait来定义了通用的日志打印方法 scala> :paste // Entering...但是这种获取field的方式与继承class是不同的:如果是继承class获得的field,实际是定义在父类中的;而继承trait获取的field,就直接被添加到类中 scala> :paste //...因为super.方法就会去调用父trait的抽象方法,此时子trait的该方法还是会被认为是抽象的 此时如果要通过编译,就得给子trait的方法加上abstract override修饰 trait Logger...的类的构造机制如下 父类的构造函数执行 trait的构造代码执行,多个trait从左到右依次执行 构造trait时会先构造父trait,如果多个trait继承同一个父trait,则父trait只会构造一次