拉链表的实现过程 当天删除,修改结束时间 一天多跑,要和 “当天修改” 区分开来,开始时间和结束时间不变。当天新增,直接添加新行,开始时间为当天,结束时间为极大值(9999-12-31)数据量大,且变化缓慢的表,需要同时记录历史数据和变化后的数据。(使用数据生效的开始时间和结束时间来记录 数据的变化)当天修改,添加新行,修改旧行的结束时间为昨天。
(12)spark sql --操作 Mysql & Hive 代码实现 spark sql --读取 Mysql & Hive 数据MysqlHiveMysqlSpark SQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中。可在启动shell时指定相关的数据库驱动路径,或者将相关的数据库驱动放到spark的类路径下。1)启动spark-shellbin/spark-shell --master spark://hadoop102:7077 [--jars mysq
(10)spark sql 笔记--01基本使用 spark sql 数据结构上下文环境对象DataFrame语法风格DataSetRDD & DataFrame & DataSet 三者 相互转化UDF函数数据结构有两种数据结构:DataFrame: 在原有RDD的基础上 加上一个结构(类似于字段名),如下(数据类型是弱类型,靠spark自动推断)+----+-------+| age| name|+----+-------+|null|Michael|| 30| Andy|| 19| Justin|
(9)累加器 & 广播变量 累加器 & 广播变量累加器为什么要使用累加器如果不使用累加器 求和,如下代码:使用累加器之后累加器怎么使用系统累加器自定义累加器累加器为什么要使用累加器如果不使用累加器 求和,如下代码: val sparkConf = new SparkConf().setMaster("local[*]").setAppName("flatmap") val sc = new SparkContext(sparkConf) val rdd = sc.makeRDD(List(1,2
(8)RDD分区器 object spark_mypartitioner { def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setMaster("local[*]").setAppName("flatmap") val sc = new SparkContext(sparkConf) val rdd = sc.makeRDD(List( ("apple","xxx"), ("p
(7)RDD缓存 & 检查点 RDD缓存为啥需要缓存将计算结果缓存到内存或磁盘中,供后面重用。因为RDD中不存储数据,如果一个RDD需要重复使用,那么需要从头再次执行来获取数据,所以为了解决这个问题,RDD提供了缓存的方法在数据执行较长,或数据比较重要的场合也可以采用持久化操作。如果数据后续出现问题,就不用从头再执行一遍了,提高了数据的安全性怎么缓存?persist方法 & cache方法使用persist方法或cache方法( 但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD
(6)RDD依赖关系 RDD依赖关系Lineage (血缘)依赖关系是两个RDD之间,RDD1用到了 RDD2,那么RDD1依赖于RDD2,血缘就是多个RDD之间的依赖关系。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。 val reduceRdd = sc.textFile("datas/word.txt") .flatMap(_.split(" ")) .map((_, 1)) .r
(5)spark RDD 序列化 RDD 序列化从计算的角度, 算子以外的代码都是在Driver端执行, 算子里面的代码都是在Executor端执行。那么在scala的函数式编程中,就会导致算子内经常会用到算子外的数据,这样就形成了闭包的效果。如果使用的算子外的数据无法序列化,就意味着无法传值给Executor端执行,就会发生错误,所以需要在执行任务计算前,检测闭包内的对象是否可以进行序列化,这个操作我们称之为闭包检测。object serializable { def main(args: Array[String]): U
(4)spark RDD 算子练习 1)数据准备agent.log:时间戳,省份,城市,用户,广告,中间字段使用空格分隔。2)需求描述统计出每一个省份每个广告被点击数量排行的Top3 /** agent.log: *时间戳,省份,城市,用户,广告,中间字段使用空格分隔。 */ // TODO 需求: 统计出每一个省份 广告被点击数量排行的Top3 val agentRdd = sc.textFile("Input/sparkCore/agent.log") agentRdd
(3)spark RDD算子详解 RDD 算子其实就是rdd方法,和scala方法区分开来分为两种 转换算子 和行动算子转换算子功能的补充封装 将旧的RDD包装成新的RDD比如 map flatmapRDD整体上分为Value类型、双Value类型和Key-Value类型map算子 – Value类型每次处理一条数据,对数据或数据类型进行转换 def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setMaster("lo
(2)Spark RDD定义 执行原理 RDD定义RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。spark的最小计算单元RDD,通过组合,让功能越来越强大。装饰者设计模式,逐层的增加功能的扩展。如下图RDD的数据只有在调用collect方法时,才会真正执行业务逻辑操作。之前的都是功能扩展,RDD是不保存数据的。执行原理Spark框架在执行时,先申请资源,然后将应用程序的数据
(1)Spark运行架构 核心概念简单理解 运行架构Spark框架的核心是一个计算引擎,它采用了标准 master-slave (主从)的结构。Driver 是master,负责管理整个集群中的作业任务调度,驱使整个应用运行起来的程序。Executor 则是 slave,负责实际执行任务。如图所示:核心概念Executor与Core在提交应用时,可以提供参数指定计算节点的个数,以及对应的资源。这里的资源一般指的是工作节点Executor的内存大小和使用的虚拟CPU核(Core)数量。应用程序相关启动参数如下:–num-execut
(7)scala 集合定义 & 常用方法 集合定义:Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本,分别位于以下两个包可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。...
(6)scala中的隐式转换 隐式转换scala允许开发人员自定义类型转换规则将两个无关的类型通过编程手段让他们自动转换隐式函数object ScalaImplicit { def main(args: Array[String]): Unit = { //定义隐式函数 让Double 类型的变量自动转换为int类型 implicit def transform( d : Double ): Int = { d.toInt } var d :
(5)scala 高阶面向对象编程 高阶面向对象编程继承和Java一样,使用extends关键字,子类继承父类的方法和属性class Person {}class User extends Person {}子类重写父类方法 之 动态绑定机制class Person {def test()=}class User extends Person {}抽象抽象类,使用abstract 关键字abstract class Person { //抽象属性 只有声明没有初始化 var name:String
(4)scala面向对象编程 (一)基础 scala面向对象编程基础面向对象编程包的声明import类属性访问权限方法对象构造方法高阶面向对象编程继承子类重写父类方法 之 动态绑定机制抽象基础面向对象编程笔记来自教程:https://www.bilibili.com/video/BV1aP4y1a7uC?p=25包的声明Java中package包的语法比较单一,Scala对此进行扩展scala同一个源码文件中,包可以多次声明包名可以和文件路径不一致在包中声明的类,调用时,导入最后的那个包(从上到下,声明的所有包的路径联合)sca
(3)scala函数式编程(三)惰性函数 和 异常处理 1.惰性函数定义:函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。这种函数我们称之为惰性函数。声明方法:加入lazy关键字 lazy val res = sum(1,2) println("-----------------------") println("res=" + res) //当需要使用到res时,就会真正的开始计算2.异常处理scala也是用try catch来捕获异常,和java类似,但写法不太相同object Exception { def main(ar
(2)scala函数式编程(二)闭包和柯里化 的理解 1.闭包可以将函数作用域外的自由变量 捕获 而 而构成一个封闭的函数scala> def addBase(x:Int) = (y:Int) => x + yaddBase: (x: Int)Int => IntaddBase可以理解为返回值为函数的方法(y:Int) => x + y是一个匿名函数,这个匿名函数的入口参数是y代码展示:scala> val addOne = addBase(1)addOne: Int => Int..