自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 收藏
  • 关注

原创 数据建模:维度建模

维度表概述:维度表是维度建模的基础和灵魂。事实表紧紧围绕业务过程进行设计,而维度表则围绕业务过程所处的环境进行设计。在维度建模中,将度量称为“事实”将环境描述为“维度”,维度是用于分析事实所需要的多样环境。维度表主要包含一个主键和各种维度字段,维度字段称为维度属性。维度使用主键标识其唯一性,主键也是确保与之相连的任何事实表之间存在引用完整性的基础。维度所包含的表示维度的列,称为维度属性。维度属性是查询约束条件、分组和报表标签生成的基本来源,是数据易用性的关键。

2024-04-09 00:51:14 781

原创 JVM多线程读写和锁

如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。情况2:线程2 先执行 num = 2,但没来得及执行 ready = true,线程1 执行,还是进入 else 分支,结。,就是:线程2 执行 ready = true,切换到线程1,进入 if 分支,相加为 0,再切回线程2 执行num = 2。反过来,每个线程都的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的 Mark Word。

2024-01-23 23:03:17 1114 1

原创 JVM类加载

DriverManager类加载器是 Bootstrap ClassLoader,即该类存在于核心类库, 但 JAVA_HOME/jre/lib 下显然没有 mysql-connector-java-5.1.47.jar 包,这样问题来了,在DriverManager 的静态代码块中,怎么能正确加载 com.mysql.jdbc.Driver 呢?④点击超链接可以看到对象的内存结构,此对象没有任何属性,因此只有对象头的 16 字节,前 8 字节是MarkWord,后 8 字节就是对象的 Class 指针。

2024-01-22 22:10:44 1075

原创 JVM垃圾回收

由于并发标记阶段并未STW,因此用户线程可能对已经标记过的对象改变其它对象对其的引用,比如被标记为待回收的对象加上新的引用,结果导致被引用的对象会被回收,因此为了防止该现象,当对象的引用将要发生变化,在此之前,写屏障(pre-writer barrier)指令将其放入队列(satb_mark_queue),等到Remark阶段再将其更新回收标记防止误回收。②各标记阶段的区别:初始标记阶段的范围为根对象,并发标记扩大到整个堆,重新标记阶段才会STW,对整个堆范围标记,而且考虑到Old里的根对象。

2024-01-18 00:09:45 1023

原创 JVM内存结构

(.class文件),按照JVM规范可知类文件结构(包含魔数、版本、常量池、访问标识与继承信息、成员变量信息、方法信息),可将二进制字节码翻译为JVM指令(这里可借助Oracle的javap工具反编译 class 文件),JVM跨平台的基础便依赖JVM指令,新生代空间不足时,触发 minor gc,伊甸园和 from 存活的对象使用 copy 复制到 to 中,存活的。负责回收堆中不再被引动的对象,当JAVA代码无法实现某些功能,需要使用底层操作系统功能,则需要调用。逐行解释执行方法代码,热点代码由。

2024-01-10 22:56:06 1114

原创 常量池和StringTable

常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息运行时常量池,常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

2024-01-10 22:43:53 409

原创 FlinkSql知识点总结

flinksql定义?Flink core架构上的sql语义处理结构化数据的上层库工作流程?sql得有表啊,数据源绑定schema后注册为catalog中的表->用户sql表达计算逻辑->tableplanner通过apache calcite解析sql并绑定元数据生成语法树,变成逻辑执行计划(树)并优化->逻辑计划+算子具体实现得到物理执行计划->代码生成得到算子树->转为作业图给到集群执行两个优化器?

2023-02-13 23:16:01 884 1

原创 Flink1.14知识点总结

基于文件的source算子?readFile读取文件数据,传入文本解析格式、路径、处理模式,处理模式为PROCESS_ONCE时文件读一次就推出了,PROCESS_CONTINUOUSLY时会一直监听文件,一旦文件内容变化则整体重读因此会造成数据重复读取,而readTextFile算子底层为传参固定的readFile如何理解Kafka Source细节?

2023-02-04 12:49:03 659

原创 [ 数据结构 ] 弗洛伊德算法(Floyd)--------最短路径问题

因为默认开始只有两种路线:直连/不直连,两种情况下默认前驱节点都是出发点,即出发点到任何顶点的前驱节点都是自己,至于后续的改动,不管最短路线改为非直连的两段还是三段,也只是针对不直连的路(即65535),而直连的两个顶点相关数据无需改动,前驱自然就是终点的前驱节点,即出发点。观察:虽然F作为中间点,但是测试时中间点第一个就用F,CD的距离和前驱都未能更新,仅更新了DE之间和DG之间数据,而当F之后的E作为中间点,CD之间数据才能更新,即CD的前驱为F,为什么会如此?为什么如此初始化前驱关系表?

2023-01-10 00:00:34 1052

原创 [ 数据结构 ] 迪杰斯特拉算法(最短路径问题)

访问情况数组(用以标记顶点已访问)+前驱节点数组(用以输出最终的最短路径)+距离数组(表示出发点到各顶点的最短距离)说明:主要广度优先搜索,同时定义。

2023-01-09 22:47:06 488

原创 [ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法

【代码】[ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法。

2023-01-09 22:12:53 1140

原创 [ 数据结构 ] 集合覆盖问题(贪心算法)

因为当多个电台都能覆盖3个地区时,我们选择了第一个,这考虑的过于简单,比如第一个电台如果包月太贵那么是否应该考虑选第2个呢。说明:整个过程中,其实重难点在第2步中如何选择能覆盖最多地区的电台,并不是选择最大的电台,而是k电台与allAreas的。如果最大,说明k就是本轮我们选择的结果,allAreas其实应该理解为目前未被电台覆盖的地区。ps:该算法的解并不一定是最优解,只是。

2023-01-09 20:36:04 1158

原创 [ 数据结构 ] 字符串匹配(暴力匹配)

str2[j]),令 i = i - (j - 1),j = 0。3)用暴力方法解决的话就会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着判断,浪费了大量的时间。(采用KMP算法优化)1)如果当前字符匹配成功(即 str1[i] == str2[j]),则 i++,j++,继续匹配下一个字符。2)现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1。1)有一个字符串 str1= ““abcdefg””,和一个子串 str2=“fg”

2023-01-09 18:50:18 133

原创 [ 数据结构 ] 背包问题(动态规划)

有一个背包,容量为4磅,现有如下物品1)要求达到的目标为装入的背包的总价值最大,并且重量不超出2)要求装入的物品不能重复(01背包)

2023-01-09 18:41:22 297

原创 [ 数据结构 ] 汉诺塔--------分治算法最佳实践

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。温馨__提示__:递归调用的过程中,别认为起始柱一直就是A,也别认为目标柱一直就是C,传参不同,柱子的作用就不同了。如果我们有 n >= 2 情况,我们总是可以看做是两个盘(最下边的盘+上面的盘)把 B 塔的所有盘 从 B->C。把最下边的盘 A->C。

2023-01-09 14:39:31 285

原创 [ 数据结构 ] 二分查找算法(非递归)

【代码】[ 数据结构 ] 二分查找算法(非递归)

2023-01-09 14:21:45 56

原创 [ 数据结构 ] 图(Graph)--------深度优先、广度优先遍历

为什么要有图?无论是线性表还是树结构,局限于表示一个直接前驱和一个直接后继的关系(一对一/一对多),当我们需要表示的关系时, 这里我们就用到了图节点间的连接成为边,节点称为顶点,一个顶点到另一个顶点所经过的边叫路径,边有方向的叫有向图,边没有方向的叫无向图,边带权值的叫带权图也叫网/邻接表,分别使用二维数组/链表,简单理解:顶点3所表示的一维数组/单链表中,顶点5表示的元素/节点大小就是顶点3和5间边的权值,权值为1表示可直接连接,否则无法直连(通常不用0而使用极大值65535表示)

2023-01-09 14:10:08 438

原创 [ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋

数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在。

2023-01-09 12:38:57 1883

原创 [ 数据结构 ] 二叉排序树(BST)

对于二叉排序树,中序遍历结果就是原数列升序排序后的结果为什么说二叉排序树结合数组+链表的优点?它的查找速度其实等价于有序数组的二分查找速度,而它的添加速度基于二分查找在找到位置后等于链表的链尾追加操作(改变空指针的指向),因此得名。

2023-01-08 22:15:42 259

原创 [ 数据结构 ] 赫夫曼编码--------数据、文件压缩解压

如上图:给定字符串按定长编码处理,最终对应二进制长度为359思考:如何压缩,将359有效降低?----

2023-01-08 21:02:40 410

原创 [ 数据结构 ] 哈夫曼树(Huffman Tree)

【代码】[ 数据结构 ] 哈夫曼树(Huffman Tree)

2023-01-08 17:00:26 170

原创 [ 数据结构 ] 堆排序--------思路、图解、代码

答:编写adjust方法,用以调整当前堆(a)为大顶堆,但是该方法并不是调用一次就能完成大顶堆,举例说明:如果将父子三节点看成是一个小小堆,那么从最后一个小小堆开始,使小小堆满足父值>子值(即大顶堆的要求),从后往前对小小堆的堆顶调用adjust方法,一直到第一个小小堆,从而实现构建大顶堆。问:整体思路简单,就是不断构建大顶堆,首尾互换,难就难在如何调整,使得构建成满足条件的大顶堆呢?adjust,就能完成构建大顶堆.-----------------看下面图。继续调整,交换,最终得到升序数组。

2023-01-08 15:48:36 281

原创 [ 数据结构 ] 二叉树详解--------前序、中序、后序、存储、线索化

why?为什么需要树结构?数组虽然查找快(通过下标访问),但无法动态扩容(拷贝到新的数组),而链表相反,树结构刚好结合两者优点浅谈树?树的存储和读取效率都很高,比如二叉排序树,理解树的抽象模型有助于理解递归的原理,树的模型接近于单向链表,父节点指向左右子树,而链表相比二叉树可以看成单叉。

2023-01-08 11:37:21 1668

原创 [ 数据结构 ] 哈希表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

2023-01-07 20:39:56 53

原创 [ 数据结构 ] 查找算法--------线性、二分、插值、斐波那契查找

查找算法有4种:线性查找二分查找/折半查找插值查找斐波那契查找。

2023-01-07 19:41:29 367

原创 [ 数据结构 ] 排序算法--------冒泡、选择、插入、希尔、快排、归并、基数、堆

1.1 排序分类内部排序和外部排序,前者数据加载到内存,后者数据量大需借助外部文件.内部排序包含:插入排序:直接插入排序,希尔排序选择排序:简单选择排序,堆排序交换排序:冒泡排序,快速排序归并排序基数排序1.2 复杂度1)度量一个程序时间有两种方法,事后统计或事前估算,事前估算就需要分析时间复杂度2)时间复杂度:算法中的基本操作语句的重复执行次数是问题规模 n 的某个函数,​ 计算方法:去常数阶–>保留最高阶项–>去除最高阶项系数​ 常见时间复杂度:常数阶 O(1)、对数阶 O(log2n)、线性阶 O(n

2022-12-09 18:57:01 751

原创 HBase概述

1)数据存储在一张表中,有行有列,rowkey作用类似主键,按字典序排序2)rowkey确定一行,列族+列确定一列3)存储在HDFS上的形式:先按rowkey范围切分为Region,一个Region对应HDFS的一个文件夹,再按列族切分为两个文件夹,一个文件夹对应一个store,再往下数据就以文件的形式存储在store文件夹里面1)StoreFile中除了Value字段,剩余的所有限定能唯一地表示一行数据,因此多个限定联合为key与Value形成k-v结构2)增改一条数据通过时间戳区分不同版本,而删除操作在

2022-06-17 11:57:42 495

原创 [ Spark ] DStream转换

​ 无状态转化操作就是把简单的 RDD 转化操作应用到每个批次上,也就是转化 DStream 中的每一个 RDD。部分无状态转化操作列在了下表中。注意,针对键值对的 DStream 转化操作(比如reduceByKey())要添加 import StreamingContext._才能在 Scala 中使用。​ 事实上每个 DStream 在内部是由许多 RDD(批次)组成,且无状态转化操作是分别应用到每个 RDD 上的。有状态转化操作UpdateStateByKeyUpdateStateByK

2022-06-14 00:23:39 171

原创 [ Spark ] RDD\DataFrame\DataSet三者关系

版本:Spark1.0 => RDDSpark1.3 => DataFrameSpark1.6 => Dataset1)RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集2)三者都有惰性机制,在进行创建、转换不会立即执行,只有在遇到Action 如 foreach 时,三者才会开始遍历运算;3)三者有许多共同的函数,如 filter,排序等;4)在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:import spark.implicits.

2022-06-14 00:22:39 173

原创 [ Spark ] 累加器.广播变量

​ 用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行merge。​累加器的少加/多加问题在于转换算子没有/多次执行自定义累加器继承AccumulatorV2,并设定泛型重写累加器的抽象方法广播变量​ 在多个并行操作中使用同一个变量,但是 Spark会为每个任务分别发送。​ 广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只

2022-06-14 00:20:56 66

原创 [ Spark ] RDD序列化.依赖.持久化

​ 从计算的角度, 算子以外的代码都是在Driver端执行, 算子里面的代码都是在Executor端执行。算子内用到算子外的数据,这样就形成了闭包的效果,算子外的数据需要序列化传值给Executor端执行,闭包检测。​ 这里的闭包指:就算Executor端的代码一行没走,只要使用了算子外的对象,就算闭包,即改变了变量的生命周期,就需要闭包检测实例:2 RDD依赖关系​ 相邻的新的RDD依赖旧的RDD,多个连续的RDD的依赖关系,称之为血缘,同时RDD会保存血缘关系,但不会保存数据,​ 容错:RD

2022-06-14 00:19:36 268

原创 [ Spark ] RDD行动算子汇总

行动算子:触发作业执行的方法,底层调用的是环境对象的runJob方法,底层代码中会创建ActiveJob,并提交执行1)def reduce(f: (T, T) => T): T​ 先聚合分区内数据,再聚合分区间数据,这里聚合的结果的类型和数据源中的类型一致2)def collect(): Array[T]​ 将不同分区的数据按照分区顺序采集到Driver端内存中,形成数组3)def count(): Long​ 返回RDD中元素的个数4)def first(): T​ 返回RDD中的第一个元素5)def

2022-06-14 00:15:24 265

原创 [ Spark ] RDD转换算子汇总

前置知识:为了区分RDD的方法和集合的方法RDD方法=>RDD算子(改变问题状态的操作,在Spark中表现为:将旧的RDD转换为新的RDD)RDD整体上分为Value类型、双Value类型和Key-Value类型1)def map[ U: ClassTag ] (f: T => U): RDD[U]​ 将数据逐条进行映射转换,值/类型的转换2)def mapPartitions[U: ClassTag](​ f: Iterator[T] => Iterator[U],​ preservesPartitio

2022-06-14 00:13:56 609

原创 [ Spark ] RDD创建.分区与并行度.分区策略

底层代码中,makeRDD方法其实就是parallelize方法任务的并行度由分区数决定,但是实际生产时,如果可用核数不足,并行会演变为并发1)makeRDD方法的第二个参数直接传入分区的数量2)如果没有传入第二个参数,使用默认值:defaultParallelism(默认并行度)​ 该值大小为scheduler.conf.getInt(“spark.default.parallelism”, totalCores),即从该对象中获得某一特定值,否则使用totalCores(当前环境的最大核数)3)手动指定

2022-06-14 00:07:26 311

原创 [ Spark ] RDD核心概念,工作原理

​ Spark计算框架为了能够对数据进行高并发和高吞吐的处理,封装了三大数据结构,用于处理不同的应用场景。三大数据结构分别是:1)RDD : 弹性分布式数据集2)累加器:分布式共享只写变量3)广播变量:分布式共享只读变量ps:数据结构:简单理解为 数据与逻辑的组织形式和存储方式1.RDD定义?​ RDD(Resilient Distributed Dataset)为弹性分布式数据集,是Spark中最基本的数据处理模型。代码中是一个抽象类(子类多,使用装饰者模式扩充功能),它代表一个弹性的、不可变、可分区

2022-06-14 00:05:10 673

原创 [ Spark ] Spark核心概念

1.Spark or Hadoop?Hadoop的MapReduce和Spark同为计算框架,使用时如何选择?​ 1)MR由于其设计初衷并不是为了满足循环迭代式数据流处理,因此在多并行运行的数据可复用场景(如:机器学习、图挖掘算法、交互式数据挖掘算法)中存在诸多计算效率等问题。Spark就是在传统的MapReduce 计算框架的基础上,利用其计算过程的优化,从而大大加快了数据分析、挖掘的运行和读写速度,并将计算单元缩小到更适合并行计算和重复使用的RDD。​ 2)Spark所基于的scala语言恰恰擅长函

2022-06-13 23:59:49 521

原创 [ Hive ] 用户自定义UDF

用户自定义UDF用户自定义函数简称UDF,源自于英文user-defined function。自定义函数总共有3类,是根据函数输入输出的行数来区分的,分别是:UDF(User-Defined-Function)普通函数,一进一出UDAF(User-Defined Aggregation Function)聚合函数,多进一出UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出需求自定义开发实现Hive函数,将手机号中间4位进行脱敏处理,满

2022-04-07 19:20:47 821

原创 [ Hive ] hive优化三 : Job执行优化

Job执行优化1 Explain1.1 语法EXPLAIN [FORMATTED|EXTENDED|DEPENDENCY|AUTHORIZATION|] queryFORMATTED:对执行计划进行格式化,返回JSON格式的执行计划EXTENDED:提供一些额外的信息,比如文件的路径信息DEPENDENCY:以JSON格式返回查询所依赖的表和分区的列表 AUTHORIZATION:列出需要被授权的条目,包括输入与输出1.2 组成执行计划一般由三个部分构成,分别是:1)The Abstr

2022-04-07 18:12:34 1339

原创 [ Hive ] hive优化二 : 表数据优化

表数据优化1 文件格式文件格式优点缺点应用场景TextFile1)是最常用且默认的格式2)不需要经过处理,可以直接cat查看3)可以使用任意的分隔符进行分割4)便于和其他工具(Pig, grep, sed, awk)共享数据5)可以搭配Gzip、Bzip2、Snappy等压缩一起使用1)耗费存储空间,I/O性能较低2)结合压缩时Hive不进行数据切分合并,不能进行并行操作,查询效率低3)按行存储,读取列的性能差1)适合于小量数据的存储查询2)一般用于做第一层数据加载和测试使

2022-04-07 18:09:45 1533

原创 [ Hive ] hive优化一 : 表设计优化

表设计优化1 普通表1.1 Hive查询基本原理创建数据库(chapter_6)创建表(tb_login),hdfs上自动在数仓的数据库目录下创建表目录关联数据:使用load命令将数据加载到表中,数据会被自动放入hdfs中对应表目录下当执行查询计划时,Hive使用表的最后一级目录作为底层处理数据的输入在元数据库metastore中表现为:1)在TBLS表中根据表明查得SD_ID2)SDS元数据表中的记录查询SD_ID对应的HDFS的表目录位置,即底层处理数据的输入

2022-04-07 18:02:53 1281

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除